计算CSV列中单词的出现次数并写入另一个CSV?

时间:2014-02-17 19:03:48

标签: python csv python-3.3

我一直致力于制作程序来打开CSV文件,计算“信息”,“低”,“中”,“高”和“严重”字样的出现次数,并得出结果写入不同的CSV。在此过程中,我希望它能够解析多个格式相同的CSV信息,并将所有结果写入一个CSV。这就是我到目前为止所做的:

import sys
import csv
import collections

severity = collections.Counter()
with open(r'C:\Report.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        severity[row[3]] +=1

print(severity.most_common)
with open(r'C:\test.csv', 'a', newline='') as write_file:
    sevwrite = csv.writer(write_file, delimiter= ',',
                      quotechar=' ', quoting=csv.QUOTE_MINIMAL)
    sevwrite.writerow([severity.most_common])

它写完了

<bound method Counter.most_common of Counter({'Info': 510, 'Medium': 30, 'Low': 24, 'High': 7, 'Severity': 1})>

进入Test.CSV文件。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

您需要调用 most_common方法:

print(severity.most_common())

sevwrite.writerow(severity.most_common())

由于.most_common()方法返回元组列表,因此无法写出您想要的内容。每个元组一个键和相应的计数。因此,上述sevwrite.writerow()调用(列表文字[...])将写入:

('Info', 510),('Medium', 30),('Low', 24),('High', 7),('Severity', 1)

到文件。由于.most_common()按排序顺序(从最高计数到最低)返回此列表,因此不同的输入CSV很可能会导致不同的严重性排序。

如果输出CSV文件中的每一行都包含计数,您可能希望将列保持在相同的一致顺序中。您也不需要包含严重性密钥;这可能是CSV文件头的一部分。

我在这里使用csv.DictWriter()代替:

with open(r'C:\test.csv', 'a', newline='') as write_file:
    sevwrite = csv.DictWriter(write_file, ('High', 'Severity', 'Medium', 'Info', 'Low'))
    sevwrite.writerow(severity)

现在每次只在同一列中为每个键写入计数。 csv.DictWriter()的第二个参数设置值将写入列的顺序。

请注意,您也可以在此处简化阅读

import csv

from collections import Counter

with open(r'C:\Report.csv', 'r') as f:
    reader = csv.reader(f)
    severities = Counter(r[3] for r in reader)

是您在此处构建Counter对象所需的全部内容。

现在,要为输入文件的系列执行此操作,您可以使用:

import csv

from collections import Counter

with open(r'C:\test.csv', 'w', newline='') as write_file:
    sevwrite = csv.DictWriter(write_file, ('High', 'Severity', 'Medium', 'Info', 'Low'))
    sevwrite.writeheader()

    for filename in list_of_filenames:
        with open(r'C:\Report.csv', 'r') as f:
            reader = csv.reader(f)
            severities = Counter(r[3] for r in reader)
            sevwrite.writerow(severities)

这里打开输出文件进行写入(不附加);这使我们有机会在顶部添加标题行sevwrite.writeheader()