【问题标题】:Python: Writing Counter to a csv filePython:将计数器写入 csv 文件
【发布时间】: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


【解决方案1】:

首先,主要问题的原因——

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]) 

【讨论】:

    【解决方案2】:

    对我来说,上述解决方案不起作用。它将单词的所有字符拆分为单独的列,因此输出是“单独列中的每个字符后跟计数”,而不是一列中的整个单词后跟计数。这可能是由于我可能犯的其他一些错误。 但是对我来说,下面的代码有效::

        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))  
    

    我希望这对其他人有帮助

    【讨论】:

    • 是的。感谢分享这个替代方案。我也遇到了类似的问题。
    【解决方案3】:
    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])
    

    甚至更简单(注意 's' 到 writerows() 函数):

    with open(root+'counter_test.csv','w') as csvfile:
        writer=csv.writer(csvfile)
        writer.writerows(count.items())
    

    【讨论】:

      【解决方案4】:

      只需使用 for 循环,我们就可以将序列计数器添加到 CSV 读取 以下代码会将计数器显示为 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

      【讨论】:

        猜你喜欢
        • 2015-01-21
        • 2017-03-29
        • 1970-01-01
        • 1970-01-01
        • 2012-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多