【问题标题】:Can I get File Modification Time from a file open for reading (python)我可以从打开读取的文件中获取文件修改时间吗(python)
【发布时间】:2012-01-07 11:30:34
【问题描述】:

file("foo.txt") 这样打开的文件有关于文件修改时间的任何信息吗?

基本上我想知道文件是否在某个时间后被修改或替换,但是如果文件在检查修改时间和打开文件之间被替换,那么你的信息不准确。

我如何确定?

谢谢。

更新

@rubayeet:感谢您的回答 (+1),我实际上没有想到这一点。但是……修改时间变了怎么办?也许我再次重新加载文件。但是,如果它改变了那个时间呢?如果文件被定期触摸,我可能会永远陷入循环!我真正想要的是一种只获得打开文件句柄和修改时间的方法,而没有潜在的无限循环。

PS 你给出的答案实际上对我的目的来说已经足够好了,因为文件不会定期更改,我现在普遍感兴趣。

更新 2

通过思考之前的更新(并进行一些试验),我意识到仅仅知道文件打开时的文件修改时间并没有多大用处,就像在阅读时修改文件一样,您可以拥有部分或全部您读入的内容中的修改数据,因此您必须打开并读取/处理整个文件,然后再次检查 mtime(根据@rubayeet 的回答),看看您是否有过时的数据。

【问题讨论】:

    标签: python file last-modified


    【解决方案1】:

    对于简单的修改时间,您可以使用:

    from os.path import getmtime
    
    modtime = getmtime('/file/to/path')
    

    如果您想要类似回调功能的东西,您可以检查 python 的 inotify 绑定:pyinotify

    您必须设置一个监视管理器,如果受监视目录中发生任何更改,它会在事件循环中通知您。您注册特定事件,例如打开文件(如果写入文件会更改 modtime)。

    如果您对文件的独占访问感兴趣,我会指向fnctl module,它在文件描述符上有一些低级和文件锁定机制。

    【讨论】:

    • 我知道如何获取文件修改时间。那不是问题。并且 inotify 不能保证告诉你重负载下的变化。
    • 您能否澄清一下 inotify 在重负载下遇到困难是什么意思?或者指出这个声明的来源?没有办法确定,两个文件属性检查之间没有文件更改,除了对文件的独占锁定/访问!您应该查看 fnctl.flock 以获得此功能。
    • 我不记得我在哪里读到这个了,我会试着去寻找它,但逻辑如下:inotify 事件是异步的并且有一个队列。当通知应用程序时,项目会从队列中弹出。如果系统非常繁忙,队列可能会被填满,因此内核将不再向队列写入任何消息。
    • 找到了一个参考:man inotify 并搜索IN_Q_OVERFLOW
    • 至于无法确定,这对我来说很好。我很高兴我的程序被用户/进程的文件修改时间所愚弄,但我宁愿它不会被繁重的负载所愚弄。 +1 用于提出fnctl.flock,尽管这对于我目前正在做的事情来说太过分了(如更新 2 中所述,此时它主要是学术兴趣)。
    【解决方案2】:
    import os
    filepath = '/path/to/file'
    modifytime1 = os.path.getmtime(filepath)
    fp = open(filepath)
    modifytime2 = os.path.getmtime(filepath)
    if modifytime1 != modifytime2:
        print "File modified after opening"
    

    【讨论】:

    • 不应该是if modifytime1 != modifytime2:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 2020-10-31
    • 1970-01-01
    相关资源
    最近更新 更多