我需要创建一个函数,根据数字列表返回文件中的某些行,但我不断收到ValueError: Mixing iteration and read methods would lose data.
任何建议吗?
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
答案 0 :(得分:2)
迭代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的方法。
答案 1 :(得分:1)
你可以通过列表理解来简单地解决这个问题:
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]
答案 2 :(得分:0)
你正在混合 ggplot(diamonds, aes(carat, label =)) +
geom_histogram(color="white") +
theme_light()+
geom_text(aes(y = y + 0.05), vjust = 0)
和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
次调用才会从文件中读取数据。