Python for Value循环中的ValueError
问题描述:
我需要做一个函数,返回基于数字列表的文件中的某些行,但我一直在收到ValueError: Mixing iteration and read methods would lose data.
有什么建议吗?Python for Value循环中的ValueError
with open(path) as f:
for line in f:
if i in lst:
a = f.readline()
ans += [a.strip()]
i += 1
else:
f.readline()
i += 1
答
你混合for line in f
和f.readline()
,这意味着你会读更多的线可能比你打算。为了避免这种情况,请尝试更改您的代码是这样的:
with open(path) as f:
while True:
if i in lst:
a = f.readline()
if not a:
break
ans += [a.strip()]
i += 1
else:
a = f.readline()
if not a:
break
i += 1
这样,只有你的readline
电话从文件中读取数据。
答
迭代在f
线条应足够了:
with open(path) as f:
for i, line in enumerate(f):
if i in lst:
# do something
ans += [line.strip()]
这假定path
,lst
和ans
定义。由于您正在迭代文件中的行,因此不需要f.readlines()
,而且您不需要增量器。只需使用enumerate
。
注意,串行列表连接(即最后一行)是低效的。根据你想要做的,看看list comprehensions,这是更快,传统上更Pythonic。考虑@Burhan Khalid的方法。
答
你可以简单地这样一个列表理解:
def filter_file(filename, line_numbers):
with open(filename) as f:
return [line.strip() for idx,line in enumerate(f) if idx in line_numbers]
result = filter_file('some_file.txt', [1,5,7])
如果line_numbers
不为0索引(1为第一行),那么你就需要调整循环:
return [line.strip() for idx,line in enumerate(f) if idx+1 in line_numbers]
一行3,'我'是什么? – pylang
变量从0开始 – dguo52001
我有一个文本文件和一个数字列表。我只需要返回与这些数字对应的行。 – dguo52001