使用python编写csv时创建新标题
我在网上抓取不同的网页,并为每个网页编写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)
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
作者
字段,其中包含来自网页
对象的所有作者,您可能希望将作业行更改为如下内容:
variables['Authors']=';'.join(webpage.authors)
这是所有作者的简单序列化。当然,您可以想出一些其他的方法-使用不同的分隔符或序列化为JSON或YAML或类似的更复杂的方法
希望这能提供一些想法。因为“Author”是一个可变长度的列表,所以您应该以某种方式将其序列化以适合单个字段。例如,使用分号作为分隔符
假设您有一个作者
字段,其中包含来自网页
对象的所有作者,您可能希望将作业行更改为如下内容:
variables['Authors']=';'.join(webpage.authors)
这是所有作者的简单序列化。当然,您可以想出一些其他的方法-使用不同的分隔符或序列化为JSON或YAML或类似的更复杂的方法
希望这能给你一些想法。写标题后,你不能覆盖它们。您可以将所有数据保存在内存中,并在获取所有数据时写入所有链接。或者在文件中写入所有数据,最后创建新文件、写入标题并从没有标题的文件中复制/添加数据。然后,您还可以向没有作者的行中添加空值(以创建格式正确的CSV)。写入标题后,您无法覆盖它们。您可以将所有数据保存在内存中,并在获取所有数据时写入所有链接。或者在文件中写入所有数据,最后创建新文件、写入标题并从没有标题的文件中复制/添加数据。然后还可以向没有作者的行添加空值(以创建格式正确的CSV)。