我一直致力于制作程序来打开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文件。任何帮助表示赞赏。
答案 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()
。