2014-03-25 183 views
3

我想使用CSV閱讀器有效閱讀文件中的列。代碼是:Python - 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

'[X爲在讀取器X]'可以寫成'列表(讀取器)'。儘管如此,明確的for循環可以更好:您只需一次遍歷CSV文件,並在您的代碼嘗試執行兩次操作時無任何問題地執行任何操作。有可能在列表理解中寫同樣的東西,但理解並不總是更加乾淨/ pythonic。 – x3al

回答

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') 
2

csv.reader返回發電機。爲了再次讀取發電機,您將不得不重新聲明它。這個answer對Python的生成器如何工作有詳細的解釋。