重新读取一个打开的文件 Python

22

我有一个脚本,它会读取一个文件,然后根据该文件完成测试。但是我遇到了一个问题,因为文件每隔一小时重新加载,而我无法让脚本在此之后或此时重新读取该文件。

所以:

  • 获取新的要读取的文件
  • 读取文件
  • 对文件执行测试
  • 获取新的要读取的文件(使用相同的名称 - 但如果它是解决方案的一部分,则可以更改)
  • 读取新文件
  • 对新文件执行相同的测试

有人能建议一种方法让Python重新读取该文件吗?


3
你尝试过什么?你能给我们展示一些代码吗?问题的具体是什么? - pypat
2
如果你不展示代码,我们如何向你展示如何修复它? - John La Rooy
将光标移动到文件开头 - fp.seek(0),然后 fp.read()。 - N Randhawa
答案没有明确提到,但是当你读取一个文件时,文件对象的位置会移动到文件末尾。当你再次使用open打开文件时,位置会自动重置,或者你可以使用f.seek手动设置位置。 - wjandrea
2个回答

42

将文件指针seek到文件的开头

with open(...) as fin:
    fin.read()   # read first time
    fin.seek(0)  # offset of 0
    fin.read()   # read again

或者重新打开文件(我更喜欢这种方式,因为否则在每次处理之间会有一个小时的时间保持文件打开但什么也不做)

with open(...) as fin:
    fin.read()   # read first time

with open(...) as fin:
    fin.read()   # read again

将这些组合在一起

while True:
    with open(...) as fin:
        for line in fin:
            # do something 
    time.sleep(3600)

我认为最好保持文件打开并重新读取它,因为打开和关闭操作非常昂贵。 你采用了一个变通方法,添加了一个睡眠调用。 - Ahmed Hamdy
@AhmedHamdy,保持文件打开状态也是有代价的。现在这不是什么问题,但以前如果你打开了很多文件,就很容易用完文件描述符。这是一种需要根据情况管理的平衡。 - John La Rooy
只是一个小细节:对于以追加模式打开的文件(即,为了在不覆盖已存在的文件的情况下创建它们),您无法执行seek(0)操作。 - undefined

20

您可以通过以下方式将光标移动到文件开头:

file.seek(0)

那么你就可以成功地阅读它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接