Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python编写csv时创建新标题_Python_Csv - Fatal编程技术网

使用python编写csv时创建新标题

使用python编写csv时创建新标题,python,csv,Python,Csv,我在网上抓取不同的网页,并为每个网页编写csv文件的每一行 import csv fieldnames=["Title", "Author", "year"] counter=1 for webpage of webpages: if counter==1: f = open('file.csv', 'wb') my_writer = csv.DictWriter(f, fieldnames)

我在网上抓取不同的网页,并为每个网页编写csv文件的每一行

import csv
fieldnames=["Title", "Author", "year"]
counter=1
for webpage of webpages:
    if counter==1:
        f = open('file.csv', 'wb')  
        my_writer = csv.DictWriter(f, fieldnames)
        my_writer.writeheader()
        f.close()

    something where I get the information (title, author and year) for each webpage

    variables={ele:"NA" for ele in fieldnames}
    variables['Title']=title        
    variables['Author']=author
    variables['year']=year


    with open('file.csv', 'a+b') as f:
    header = next(csv.reader(f))
    dict_writer = csv.DictWriter(f, header)
    dict_writer.writerow(variables) 
    counter+=1

但是,可能会有多个作者(因此,web抓取后的作者实际上是一个列表),因此我希望csv文件的标题中包含:author1、author2、author3等。但我不知道作者的最大数量是多少。因此,在循环中,我想编辑标题并开始添加author2、author3等,这取决于是否需要在该行中创建更多作者。

它可能类似于:

def write_to_csv(file_name, records, fieldnames=None):

    import csv
    from datetime import datetime

    with open('/tmp/' + file_name, 'w') as csvfile:
        if not fieldnames:
            fieldnames = records[0].keys()
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames,   extrasaction='ignore')
        writer.writeheader()
        for row in records:
            writer.writerow(row)

def scrape():
    for webpage of webpages:
        webpage_data = [{'title':'','author1':'foo','author2':'bar'}] #sample data
        write_to_csv(webpage[0].title+'csv', webpage_data,webpage_data[0].keys())
我假设:

  • 相同网页的数据将保持一致,但循环中的下一个网页会有所不同
  • 网页数据是字典列表,其值映射到键
  • 以上代码基于Python 3

因此,在循环中,我们只需获取数据,并将相关字段名和值传递给另一个函数,以便能够将其写入csv。

它可能类似于:

def write_to_csv(file_name, records, fieldnames=None):

    import csv
    from datetime import datetime

    with open('/tmp/' + file_name, 'w') as csvfile:
        if not fieldnames:
            fieldnames = records[0].keys()
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames,   extrasaction='ignore')
        writer.writeheader()
        for row in records:
            writer.writerow(row)

def scrape():
    for webpage of webpages:
        webpage_data = [{'title':'','author1':'foo','author2':'bar'}] #sample data
        write_to_csv(webpage[0].title+'csv', webpage_data,webpage_data[0].keys())
我假设:

  • 相同网页的数据将保持一致,但循环中的下一个网页会有所不同
  • 网页数据是字典列表,其值映射到键
  • 以上代码基于Python 3
因此,在循环中,我们只需获取数据,并将相关字段名和值传递给另一个函数,以便能够将其写入csv。

因为“Author”是一个可变长度的列表,您应该以某种方式将其序列化,以适应单个字段。例如,使用分号作为分隔符

假设您有一个
作者
字段,其中包含来自
网页
对象的所有作者,您可能希望将作业行更改为如下内容:

variables['Authors']=';'.join(webpage.authors)
这是所有作者的简单序列化。当然,您可以想出一些其他的方法-使用不同的分隔符或序列化为JSON或YAML或类似的更复杂的方法

希望这能提供一些想法。

因为“Author”是一个可变长度的列表,所以您应该以某种方式将其序列化以适合单个字段。例如,使用分号作为分隔符

假设您有一个
作者
字段,其中包含来自
网页
对象的所有作者,您可能希望将作业行更改为如下内容:

variables['Authors']=';'.join(webpage.authors)
这是所有作者的简单序列化。当然,您可以想出一些其他的方法-使用不同的分隔符或序列化为JSON或YAML或类似的更复杂的方法


希望这能给你一些想法。

写标题后,你不能覆盖它们。您可以将所有数据保存在内存中,并在获取所有数据时写入所有链接。或者在文件中写入所有数据,最后创建新文件、写入标题并从没有标题的文件中复制/添加数据。然后,您还可以向没有作者的行中添加空值(以创建格式正确的CSV)。写入标题后,您无法覆盖它们。您可以将所有数据保存在内存中,并在获取所有数据时写入所有链接。或者在文件中写入所有数据,最后创建新文件、写入标题并从没有标题的文件中复制/添加数据。然后还可以向没有作者的行添加空值(以创建格式正确的CSV)。