我已经看过很多关于向后执行此操作的帖子,但我无法找到任何方法将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)
我愿意接受更好的方法。任何和所有的帮助表示赞赏。提前谢谢。
答案 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
循环之外。如果您使用set
或OrderedSet
代替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])