(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/
答案 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。