我有一个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
我想计算数字,颜色和数字2一起出现的次数,因此,例如,上面列表的输出将是:’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以来已经有几年了忘记了这么多。任何帮助将不胜感激。
答案 0 :(得分:4)
首先,主要问题的原因 -
TypeError: 'str' does not support the buffer interface
是你在二进制模式下打开文件,你应该以文本模式打开文件(没有b
)。
其次,我会说在您的情况下使用普通csv.writer
比csv.DictWriter()
更容易,因为您的字典的创建方式。
将结果写入csv的方法是 -
#Assuming you have previously created the counter you want to write
#lets say you stored the counter in a variable called cnter
with open('newfile.csv','w') as csvfile:
fieldnames=['number','colour','number2','count']
writer=csv.writer(csvfile)
writer.writerow(fieldnames)
for key, value in cnter.items():
writer.writerow(list(key) + [value])
答案 1 :(得分:0)
对我来说,以上解决方案无效。它将单词的所有字符拆分为不同的列,因此输出为“单独的列中的每个字符,后跟计数”,而不是一列中的整个单词,后跟计数。这可能是由于我可能犯了一些其他错误。 但是对我来说,下面的代码有效::
with open(outfile, encoding='utf-8-sig', mode='w') as fp:
fp.write('KMC,freq\n')
for tag, count in cnt.items():
fp.write('{},{}\n'.format(tag, count))
我希望这对其他人有帮助
答案 2 :(得分:0)
import csv
假设 count 是Python 3计数器。
如果 key 是字符串,则不要将其拆分为包含的每个字符:
with open(root+'counter_test.csv','w') as csvfile:
writer=csv.writer(csvfile)
for key, value in count.items():
writer.writerow([key] + [value])
甚至更简单(注意writerows()函数的's'):
with open(root+'counter_test.csv','w') as csvfile:
writer=csv.writer(csvfile)
writer.writerows(count.items())
答案 3 :(得分:0)
通过使用for循环,我们可以将序列计数器添加到CSV reade 以下代码将把计数器显示到csv文件中
import csv
x=0
reader = csv.reader(open("c:/path/abc.csv"))
for raw in reader:
x += 1
print(raw)
print(x)
以上代码将像这样显示输出
['id','fname','lname'] 1个 ['1','a','x'] 2 ['2','b','y'] 3 ['3','c','z'] 4