【问题标题】:avoiding mixed iteration and reading error in Python避免 Python 中的混合迭代和读取错误
【发布时间】:2015-04-26 19:35:49
【问题描述】:

我有这个文件,我正在用 Python 2.7 解析

a
b

我这样解析:

f = open("file.txt", "r")
for l in f:
  if l == "a\n":
    break
# this causes an error
print f.readline()

这会导致:

ValueError: Mixing iteration and read methods would lose data

为什么 Python 会抛出这个错误?我想读取一个文件,直到在循环中满足条件,然后通过调用readline() 读取结果。不明白为什么会出现错误,因为 readline() 调用在引用文件句柄的循环之外。

【问题讨论】:

  • 在 python3 中,如果你将 print 更改为 print(),它就可以工作
  • @MartinB 我正在使用 python 2.7
  • 因为这两个操作都会操纵文件的当前位置,这可能会导致数据丢失,如错误消息所示。 Python 无法知道您在 r.readline() 语句之后不会再次使用迭代器。要么自己读取文件并将其分成几行,要么使用 for line in f 迭代器,但不能同时使用两者。对于您的情况,您可以简单地在最后执行 print next(f) 来推进迭代器,而不是使用 readline()
  • @LukasGraf:为什么next 不同? next 和 for line in f 都使用迭代器,不是吗?我不明白区别
  • @lgd 确切地说,next(iterator) 正是 for 循环在每次迭代中为您所做的事情。所以要么使用迭代器, read() / readline() 方法,但不要混合使用它们。

标签: python io file-handling


【解决方案1】:

您可以通过显式调用next() 从文件迭代器中获取下一行。

with open("file.txt") as f:
    for l in f:
        if l == "a\n":
            break
    line_after_a = next(f)
    print line_after_a

【讨论】:

    猜你喜欢
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 2020-06-01
    • 2022-09-27
    • 2014-02-25
    相关资源
    最近更新 更多