Python,处理目录中的文件是否安全?

时间:2014-02-10 04:04:10

标签: python python-3.x

(Python 3)

我有一个将入站文件放入目录(不是用Python编写)的过程。

单独的Python应用程序会定期处理目录中的所有文件,如下所示:

def getfilestobeprocessed(path):
    filestobeprocessed = []
    for dirpath, dirnames, filenames in os.walk(path):
        for filename in filenames:
            filestobeprocessed.append({ "filename": filename, "dirpath": dirpath })
    return filestobeprocessed

我担心的是,如果入站流程是编写大文件的一半,该怎么办?我的Python脚本会做什么?是否应该只处理已完成由入站处理器写入的文件,它是否会开始处理文件?我应该在处理之前检测文件是否打开?

我会考虑使用Pyinotify,除非这个人批评它http://www.serpentine.com/blog/2008/01/04/why-you-should-not-use-pyinotify/

3 个答案:

答案 0 :(得分:2)

当您在处理文件时打开(或重命名,删除...)文件时,您将收到“正在使用中的文件”错误。在Windows上它是代码32.如果和当你看到这个错误时,只是不处理该文件 - 它将在下一次处理时处理。

答案 1 :(得分:1)

使用锁定文件。

因此。当它复制时,使用filename.lock然后在完成复制时将其重命名为正确的扩展名。

然后输入if语句,如

def getfilestobeprocessed(path):
    filestobeprocessed = []
    for dirpath, dirnames, filenames in os.walk(path):
        for filename in filenames:
            if !filename.endswith(.lock):
                filestobeprocessed.append({ "filename": filename, "dirpath": dirpath })
    return filestobeprocessed

答案 2 :(得分:0)

也许操作系统可以告诉您另一个进程是否有该文件。

一个非常好的解决方案是决定在60秒之后,如果文件没有改变,那么写入它的任何内容都不再这样做了。看看http://docs.python.org/3/library/os.html#os.stat