CSV中的列是否要在python中列出?

CSV中的列是否要在python中列出?,python,list,csv,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

我已经看到很多关于向后执行此操作的帖子,但是我没有找到任何方法将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)

我愿意用更好的方法来做这件事。非常感谢您的帮助。提前感谢。

您正在对
阅读器进行三次迭代:

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]
这足以使代码正常工作

这里有一些其他的提示。不需要它们来修复您的代码,但是您肯定会从中受益:

  • 我想您应该将servername的
    放在servers
    循环中,而不是reader
循环中的
  • 如果使用
    集合
    有序集合
    而不是
    b
    的列表,则可以完全避免 servers中servername的
    循环并替换为一行:

    b.update(servers)
    

  • 您的最佳选择是只循环一次
    阅读器
    ,然后收集循环中服务器的计数和唯一名称:

    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文件中列出的服务器的顺序

    如果确实需要保留订单,请使用单独的
    seen
    set:

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

    预期的产出究竟是多少?您不能在
    读卡器上循环两次,至少不能不将
    f
    倒带到
    f.seek(0)
    开头。并不是说这是一种有效的方法。所以您希望第4列(
    行[3]
    )有一个
    计数器()
    ),第10列(
    行[9]
    )有一个唯一的列表?您在这里没有使用
    c
    ,需要吗?^这正是我想要的。计数器工作正常,我希望b在末尾包含第10列的唯一值。就是这样。非常感谢,我看这个太久了。