2016-05-24 47 views
0

我想打開一個文本文件使用csv模塊,其中我有一些值,然後提取和兩個單獨的列表填充。爲什麼這個python列表在這種情況下顯示爲空?

這是文件example.txt的:

1,2 
3,4 
6,8 
8,2 
9,3 

有在不同的場景不同的輸出,當我嘗試運行此代碼:

with (open('A:\WorkSpace--Python\Plotter\MainSource\example.txt','r')) as egFile: 
    plot=csv.reader(egFile,delimiter=',') 
    x=[int(row[0]) for row in plots] 
    y=[int(row[1]) for row in plots] 

在IPython中,當我引用x和y它輸出y的空列表。

對於X:

[1,3,6,8,9]

用於Y:

[]

但是,如果我註釋掉正在填充x的行,然後引用y返回適當的列表。

with (open('A:\WorkSpace--Python\Plotter\MainSource\example.txt','r')) as egFile: 
    plot=csv.reader(egFile,delimiter=',') 
    '''x=[int(row[0]) for row in plots]''' 
    y=[int(row[1]) for row in plots] 

輸出y:

[2,4,8,2,3]

我已經使用不同的變量名稱試過,但結果仍然相同。

回答

4

A csv.reader是一個懶惰(意味着它只會根據需要生成數據)迭代器,當你迭代一次就像生成器一樣,迭代器會耗盡。在宣佈x後,它是空的。

你可以用list兌現它允許多個迭代:

plot = list(plot) 

但是,如果您的CSV文件很大,這將佔用大量的內存,但它並沒有真正做,因爲在這種情況下,差異無論如何,您將所有值保存在xy之內。

另一種方法是:

x = [] 
y = [] 
for row in plot: 
    x.append(int(row[0])) 
    y.append(int(row[1])) 

x = [] 
y = [] 
for xrow, yrow in plot: 
    x.append(int(xrow)) 
    y.append(int(yrow)) 
+0

如果我多次運行閱讀器功能該怎麼辦?它仍會從同一文件中讀取嗎?或者我必須再次打開嗎? –

+0

@ashishkaran文件通過迭代同樣耗盡,但您可以使用'file.seek(0)'來重置它們。不過不要擔心,只需像最初建議的那樣使用'list'即可。我懷疑你的文件太大,無法在內存中處理。如果是這樣,無論如何你都不能指望它。 –

0

繼從@Alex的回答,您可以使用一個明確的循環用於設置x,y值:

x = [] 
y = [] 
with (open('E:\\TEMP\\xy.csv','r')) as egFile: 
    plots=csv.reader(egFile,delimiter=',') 
    for row in plots: 
     x.append(int(row[0])) 
     y.append(int(row[1])) 
print x 
print y 
相關問題