2016-05-24 49 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 
相关问题