2014-02-17 81 views
3

我一直致力於開發一個程序來打開一個CSV文件,計算單詞「Info」,「Low」,「Medium」,「High」和「Critical」出現的次數,並將結果寫入到另一個CSV。順着這條道路,我希望它能夠解析多個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文件。任何幫助表示讚賞。

回答

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

+0

擺脫Counter循環的一個好方法是:'severity.update(cvs.reader(f)中行的行[3])''。使用帶標題鍵的DictReader而不是硬編碼的'3'索引也許更好。 –

+0

@DaneWhite:在那裏*是一個標題行。硬編碼'3'與硬編碼字典密鑰沒什麼兩樣。 –

+0

@Martjin:是的,只要有一個標題行。但是,對列順序的代碼依賴性與對數據標籤的依賴性有很大不同。區別與實現依賴關係和接口依賴關係相同。 –

相關問題