我正在尝试使用CSV阅读器有效地读取文件中的列。代码是:
import csv
csv.register_dialect('csvrd', delimiter='\t', quoting=csv.QUOTE_NONE)
with open('myfile.txt', 'rb') as f:
reader = csv.reader(f,'csvrd')
a0=[x[0] for x in reader]
a1=[x[1] for x in reader]
我获取第一列中的值,但a1为空。如果我先写a1,那么a0是空的。
我知道一个简单的解决方案,插入
reader=[x for x in reader]
但只是好奇的原因。当您从阅读器中读取条目时,是否将其删除?
示例myfile.txt
c11 c21 c31
c21 c22 c32
答案 0 :(得分:7)
您不能多次遍历reader
,而不是将基础文件重新开始重新开始。
zip(*reader)
将行转换为列:
a0, a1, a2 = zip(*reader)
演示:
>>> import csv
>>> csv.register_dialect('csvrd', delimiter='\t', quoting=csv.QUOTE_NONE)
>>> data = '''\
... c11\tc21\tc31
... c21\tc22\tc32
... '''
>>> reader = csv.reader(data.splitlines(True), 'csvrd')
>>> a0, a1, a2 = zip(*reader)
>>> a0
('c11', 'c21')
>>> a1
('c21', 'c22')
>>> a2
('c31', 'c32')
答案 1 :(得分:2)
csv.reader
返回一个生成器。为了再次从发生器读取,您必须重新声明它。这个answer详细解释了Python的生成器是如何工作的。