【问题标题】:What happens if a file is edited while open?如果文件在打开时被编辑会发生什么?
【发布时间】:2021-02-21 19:24:00
【问题描述】:

如果我有一个文件test.txt,我会这样打开它:

import time
with open("test.txt", "r") as f:
    time.sleep(30)
    print(f.readlines())

我在 Python 打开文件和读取行之间使用文本编辑器编辑文件,我应该期待什么?

我应该看到打开文件之前的行,还是编辑后文件的新行,还是不确定我会看到什么?

(我将自己运行这些测试,但我想我会在这里问一下,以防人们有更多信息,也可以分享我的结果。)

编辑: 通过一些有用的 cmets 和测试,我认为我对正在发生的事情有了相当不错的理解,但更深入的理解将不胜感激。例如,我可以在 readlines 正在运行 附近编辑一个非常大的文件并让它接受更改吗?还是文件被锁定在每个单独的函数中?

【问题讨论】:

  • 这可能只是你得到一个拒绝的对话框:The file is locked for editing by another user. 因为你只是在阅读它虽然'r' 不会发生很多事情。
  • 无论如何该文件已经被读取。您只是在延迟打印内存中的内容。
  • @RJAdriaansen 这也是我认为可能发生的事情,但这不是我得到的结果。
  • 那我和你一样好奇这个谜团解开了!
  • @RJAdriaansen 这实际上是不正确的。 f.readlines() 是一次从文件中读取一行的序列。 open 不读取文件它只是准备 pyton 读取它。该信息不存储在内存中,因此在显式调用读取之前根本不会读取该文件。将f.read() 存储在变量中意味着所有信息都已被读取。

标签: python file-io


【解决方案1】:

看起来文件是从文件对象的当前位置读取的。

当您使用with open("read_file_test.txt", "r") as f: 打开文件时,Python 将准备好读取文件,并将文件对象的当前位置放置在索引 0 处。

当实际读取文件时,Python 将从该文件位置读取文件的最新版本。

我为支持这一点而进行的测试如下:

我跑了

import time
with open("read_file_test.txt", "r") as f:
    # gives me a countdown timer
    for i in range(10):
        print(i)
        time.sleep(1)
    print(f.readlines())

并在第 9 秒处保存了新编辑的文件。打印到屏幕上的是文件的新编辑文本。

然后,根据@Kraigolas 的建议,我跑了:

import time
with open("read_file_test.txt", "r") as f:
    bar = f.read()
    print(bar)
    for i in range(10):
        print(i)
        time.sleep(1)
    print(f.readlines())

当它启动时,它会打印文件的原始内容。然后我在倒计时期间在文件中添加了一个新行。倒计时结束后,它只打印出添加的新行,没有其他内容。

这使我相信文件对象将存储它在文件中的字符位置,并且始终从文件的最新版本中的该位置读取。

但是,如果有人知道更多细节或找到与此相矛盾的证据,我很想听听!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    相关资源
    最近更新 更多