2014-03-05 33 views
1

我見過很多關於這樣做的帖子,但我一直無法找到任何方法將csv文件中列的內容寫入列表。有了這些之後,我會循環將所有唯一值添加到單獨的列表中,並計算總的唯一值的數量。 這是我有:CSV中的列以在Python中列出?

b=[] 
c=[] 
servers = [] 
fname=(r'file') 
with open(fname, 'r') as f: 
    reader = csv.reader(f) 
    severities = Counter(row[3] for row in reader) 
    servers = list(row[9] for row in reader) 
    for row in reader: 
     print (row[9]) 
     for servername in servers: 
      if servername not in b: 
       b.append(servername) 

我接受更好的方法來做到這一點。任何和所有的幫助表示讚賞。提前致謝。

+0

準確的預期輸出是什麼?你不能在'reader'上循環兩次,至少不用'f.seek(0)'退回'f'開始。這並不是說這樣做的有效方式。 –

+0

所以你想有第四列(行[3]')的Counter()和第十列(行[9])的* unique *列表?你在這裏不使用'c',這是否需要? –

+0

^這正是我想要的。計數器工作正常,我希望b在最後包含第10列的唯一值。 – RonTheBear

回答

2

您遍歷reader三次:

severities = Counter(row[3] for row in reader) # First time 
servers = list(row[9] for row in reader) # Second time 
for row in reader: # Third time 

當你迭代的第一次,你「排」,因此它不會產生任何項目的第二和第三次。

你應該做這樣的事情:

severities = Counter() 
servers = [] 
for row in reader: 
    severities[row[3]] += 1 
    servers.append(row[9]) 
    print row[9] 

這足以使代碼工作。

這裏有一些其他的提示。他們並不需要修復您的代碼,但是你肯定會從中受益:

  • 我想你想的for servername in servers環放置了for row in reader循環。
  • 如果使用setOrderedSet,而不是爲b列表,你可以完全避免 的for servername in servers循環,並用一行替換爲:

    b.update(servers) 
    
+0

就是這樣。非常感謝,我一直在看這個太久了。 – RonTheBear

0

你最好的選擇是循環過reader只需一次並收集循環中服務器的計數和唯一名稱:

severities = Counter() 
servers = set() 

with open(fname, 'rb') as f: 
    reader = csv.reader(f) 
    for row in reader: 
     severities[row[3]] += 1 
     servers.add(row[9]) 

這裏假定您不關心CSV文件中列出的訂單servers

如果爲了確實需要保存,使用一個單獨的seen集:

severities = Counter() 
servers = [] 

with open(fname, 'rb') as f: 
    reader = csv.reader(f) 
    seen = set() 
    for row in reader: 
     severities[row[3]] += 1 
     if row[9] not in seen: 
      servers.append(row[9]) 
      seen.add(row[9]) 

如果文件比較小,你也可以用調換列脫身;這在這裏是過分的,但看起來像:

with open(fname, 'rb') as f: 
    reader = csv.reader(f) 
    cols = zip(*reader) # transpose the rows to columns 
    severities = Counter(cols[3]) 
    servers = set(cols[9]) 
+0

是的,這就是它,謝謝 – RonTheBear