带有for循环的Python中的ValueError

时间:2017-02-19 04:37:35

标签: python file-read

我需要创建一个函数,根据数字列表返回文件中的某些行,但我不断收到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

3 个答案:

答案 0 :(得分:2)

迭代f中的行应该足够了:

with open(path) as f:
    for i, line in enumerate(f):
       if i in lst:
           # do something
           ans += [line.strip()]

这假定pathlstans已定义。由于您正在迭代文件中的行,因此您不需要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 次调用才会从文件中读取数据。