Python:将计数器写入csv文件

时间:2015-09-16 15:21:16

标签: python csv dictionary counter

我有一个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以来已经有几年了忘记了这么多。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:4)

首先,主要问题的原因 -

TypeError: 'str' does not support the buffer interface

是你在二进制模式下打开文件,你应该以文本模式打开文件(没有b)。

其次,我会说在您的情况下使用普通csv.writercsv.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