我正在通过在Python中使用open读取文件,然后在with循环中执行所有其他操作。调用函数时,我只能在循环内打印第一个操作,而其他操作则为空。我可以通过使用其他方法(如readlines)来做到这一点,但是我没有找到为什么这行不通。我以为原因可能是关闭文件了,但是在打开时要照顾好它。有人可以建议我怎么了
def read_datafile(filename):
with open(filename, 'r') as f:
a = [lines.split("\n")[0] for number, lines in enumerate(f) if number ==2]
b = [lines.split("\n")[0] for number, lines in enumerate(f) if number ==3]
c = [lines.split("\n")[0] for number, lines in enumerate(f) if number ==2]
return a, b, c
read_datafile('data_file_name')
我仅获得a的值,而其他所有值均为空。注释'a'时,我得到b的值,其他则为空。
更新 该文件如下所示:
-0.6908270760153553 -0.4493128078936575 0.5090918714784820
0.6908270760153551 -0.2172871921063448 0.5090918714784820
-0.0000000000000000 0.6666999999999987 0.4597549674638203
0.3097856229862140 -0.1259623621214220 0.5475896447896115
0.6902143770137859 0.4593623621214192 0.5475896447896115
答案 0 :(得分:0)
您到底想使用此脚本做什么?这里的lines
变量可能未包含您想要的变量:它将包含一行,因为该文件被行枚举。
答案 1 :(得分:0)
构造
with open(filename) as handle:
a = [line for line in handle if condition]
b = [line for line in handle]
将始终返回空的b
,因为a
中的迭代器已经消耗了打开文件句柄中的所有数据。一旦到达流的末尾,尝试读取任何内容的其他尝试将仅返回任何内容。
如果输入是可搜索的,则可以将其后退并再次读取所有相同的行;或者您可以close
(显式或隐式地通过离开with
块)并再次打开它,但更有效的解决方案是只读取一次,然后从中选择您实际想要的行记忆。请记住,从磁盘读取字节比从内存中读取字节要容易地花费几个数量级的时间。并且请记住,您读取的数据可能来自不可搜索的来源,例如来自另一个进程的标准输出,或者来自网络连接另一端的客户端。
def read_datafile(filename):
with open(filename, 'r') as f:
lines = [line for line in f]
a = lines[2]
b = lines[3]
c = lines[2]
return a, b, c
如果文件太大而无法一次放入内存,那么您将面临一系列不同的问题。也许在这种情况下,您似乎从一开始就只希望有几行,但首先只将那么多行读入内存。