CSV列以python列出?

时间:2014-03-05 17:44:02

标签: python list csv

我已经看过很多关于向后执行此操作的帖子,但我无法找到任何方法将csv文件中的列内容写入列表。在我有了这个之后,我将循环将所有唯一值添加到单独的列表中并计算总唯一值的数量。 这就是我所拥有的:

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)

我愿意接受更好的方法。任何和所有的帮助表示赞赏。提前谢谢。

2 个答案:

答案 0 :(得分: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)
    

答案 1 :(得分: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])