CSV中的列是否要在python中列出?
我已经看到很多关于向后执行此操作的帖子,但是我没有找到任何方法将csv文件中列的内容写入列表。完成后,我将循环将所有唯一值添加到一个单独的列表中,并计算唯一值的总数。 这就是我所拥有的: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
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列的唯一值。就是这样。非常感谢,我看这个太久了。