【发布时间】:2015-12-13 06:47:09
【问题描述】:
我有一个 csv 数据文件,其中包含 ‘number’、’colour’、’number2’、’foo’、’bar’ 列,如下所示:
12, red, 124, a, 15p
14, blue, 353, c, 7g
12, blue, 125, d, 65h
12, red, 124, c, 12d
我想计算 number、color 和 number2 一起出现的次数,例如,上面列表的输出将是:’12, red, 124 :2’,’14, blue, 353: 1’, ’12, blue, 125: 1’。我已经通过使用:
import csv
datafile=open('myfile.csv','r')
usefuldata=[]
for line in datafile:
usefuldata.append(line)
from collections import Counter
outfile1=Counter((line[1],line[2],line[3]) for line in usefuldata)
print(outfile1)
这给了我:
Counter({(‘12’,’red’,’135’): 21, (‘15’,’blue’,’152’):18, (‘34’,’green’,’123’):16 etc})
这很好,但我想把它写到一个文件中。我希望文件有 4 列:数字、颜色、数字 2 和计数。我意识到这是一个常见问题,并且我尝试了其他线程上建议的几种不同方法,但都没有奏效。
Newfile=open(‘newfile.csv’,’wb’)
fieldnames=['a','b']
csvwriter=csv.DictWriter(newfile, delimiter=',', fieldnames=fieldnames)
csvwriter.writerow(dict((fn,fn) for fn in fieldnames))
for row in outfile1:
csvwriter.writerow(row)
还有
with open('newfile.csv','wb') as csvfile:
fieldnames=['number','colour','number2']
writer=csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerow(Counter((line[1],line[2],line[3]) for line in usefuldata))
countwriter=csv.writer(csvfile, delimiter=', ')
countwriter.writerow(outfile1)
两者都给我错误
return self.writer.writerow(self._dict_to_list(rowdict))
TypeError: 'str' does not support the buffer interface
我也尝试过使用泡菜:
import pickle
with open('newfile.csv','wb') as outputfile:
pickle.dump(outfile1, outputfile)
给我乱码文件。
我目前的尝试是使用
writer=csv.DictWriter(newfile, outfile1)
for line in outfile1:
writer.writerow(line)
但这给了我一个关于字段名的错误。
我知道这是一个常见的问题,我意识到我只是在挣扎,因为我真的不知道自己在做什么——我使用 python 已经有几年了,而且我已经忘记了这么多。任何帮助将不胜感激。
【问题讨论】:
-
如果你传递一个生成器/序列,使用“writerows”,而不是“writerow”。 Pickle 文件对人们来说是乱码,但如果你想在其他地方加载,Pickle 可以阅读。 DictWriter 的参数是:csvfile, fieldnames, ...,所以你的第一个参数是一个文件,你的第二个参数是一个字段名列表。
标签: python csv dictionary counter