假设:
import csv
def writeToCsv(rows):
with open('results.csv', 'w') as csvfile:
fieldnames = ['Name', '#Reviews', 'Address', 'Phone']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for row in rows:
writer.writerow(row)
当我尝试:
row = {
'Name': self.validEntries.keys()[0],
'#Reviews': self.validEntries.values()[0],
'Address': (nap[0] + ', ' + nap[1]),
'Phone': nap[2]
}
writeToCsv(row)
我明白了:
ValueError: dict contains field not in fieldnames: 'P', 'h', 'o', 'n', 'e'
为什么writerow
逐个字符地分割这个字段(我想它会对每个字段做同样的事情)?
答案 0 :(得分:2)
您应该将dictionary
传递给writer.writerow
,而不是将每个key
单独传递到写行中。
另外,如果你想将多行(意思是多个词典的列表)一起写入csv,你可以使用 - writer.writerows(rows)
将diciontaries列表传递给它。
示例 -
import csv
with open('results.csv', 'w') as csvfile:
fieldnames = ['Name', '#Reviews', 'Address', 'Phone']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
row = {'Name':'Blah','#Reviews':'Blah','Address':'Blah','Phone':'Blah'}
writer.writeheader()
writer.writerow(row)
rows = [{'Name':'Blah2','#Reviews':'Blah2','Address':'Blah2','Phone':'Blah2'},{'Name':'Blah1','#Reviews':'Blah1','Address':'Blah1','Phone':'Blah1'}]
writer.writerows(rows)
此后results.csv
看起来像 -
Name,#Reviews,Address,Phone
Blah,Blah,Blah,Blah
Blah2,Blah2,Blah2,Blah2
Blah1,Blah1,Blah1,Blah1
在您的情况下,您需要使用writer.writerow(rows)
而不循环遍历行。
或者您也可以将行列表作为writeToCsv([row])
发送,但是您仍然不需要遍历行,您应该使用writer.writerows()
将行写入字典。 (注意额外的s
)
答案 1 :(得分:1)
我认为您必须将代码更改为:
row = {'Name': self.validEntries.keys()[0], '#Reviews' : self.validEntries.values()[0], 'Address' : (nap[0] + ', ' + nap[1]), 'Phone': nap[2]}
writeToCsv([row])
你的writeToCsv期待列表不是dict。