混合文件与循环

26 投票
4 回答
38668 浏览
提问于 2025-04-15 11:24

我正在写一个脚本,用来记录另一个程序的错误,并在遇到错误时从出错的地方重新启动这个程序。出于某种原因,这个程序的开发者没有把这个功能默认放进去。

总之,这个程序会读取一个输入文件,解析它,然后生成一个输出文件。输入文件有特定的格式:

UI - 26474845
TI - the title (can be any number of lines)
AB - the abstract (can also be any number of lines)

当程序出现错误时,它会提供一些参考信息,帮助你追踪错误。这些信息包括用户界面、出错的部分(标题或摘要),以及相对于标题或摘要开始的行号。我想要记录出错的句子,方法是写一个函数,输入参考信息和文件,找到出错的句子并记录下来。我想到的最好方法是从文件中向前移动特定的次数(也就是n次,其中n是相对于部分开始的行号)。我觉得这样做是合理的:

i = 1
while i <= lineNumber:
    print original.readline()
    i += 1

我不明白为什么这样会导致数据丢失,但Python认为会,并且提示我 ValueError: Mixing iteration and read methods would lose data。有没有人知道该怎么正确地做这个?

4 个回答

0

假设你只需要一行,这个可能会对你有帮助。

import itertools

def getline(fobj, line_no):
    "Return a (1-based) line from a file object"
    return itertools.islice(fobj, line_no-1, line_no).next() # 1-based!

>>> print getline(open("/etc/passwd", "r"), 4)
'adm:x:3:4:adm:/var/adm:/bin/false\n'

你可能需要处理一下StopIteration错误(如果文件的行数少于预期的话)。

12

使用 for 循环和 enumerate 函数。

举个例子:

for line_num, line in enumerate(file):
    if line_num < cut_off:
        print line

注意: 这里假设你已经在处理文件时做好了清理工作,比如关闭文件句柄等。

另外,如果你喜欢更函数式的写法,takewhile 函数也可能会很有用。

50

你遇到这个ValueError错误,可能是因为你的代码里同时有 for line in original:original.readline()。一个简单的解决办法,可以在不让程序变慢或消耗更多内存的情况下解决这个问题,就是把

for line in original:
    ...

改成

while True:
    line = original.readline()
    if not line: break
    ...

撰写回答