避免以前的文件

时间:2011-02-16 20:47:48

标签: python

我有一个包含很多子目录的目录。

我正在浏览这些目录并找到一些文件并在这些文件上运行一些命令。如何将指针指向我完成的位置?有时这个过程会中断,下次我运行程序时,我想从我离开的地方开始。

def locate(pattern, root=os.curdir):
    '''Locate all files matching supplied filename pattern in and below
    supplied root directory.'''

    for path, dirs, files in os.walk(os.path.abspath(root)):
        for filename in fnmatch.filter(files, pattern):
            yield os.path.join(path, filename)



for filename in locate("*.dll"):
#do something

2 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点......但最简单的方法是创建,例如,一个新文件与已经处理过的每个文件一起,然后检查它。例如:

for filename in locate("*.dll"):
    if os.path.exists(filename + ".processed"):
        continue
    process(filename)
    open(filename + ".processed", "w").close()

for filename in locate("*.processed"):
    os.remove(filename)

答案 1 :(得分:1)

我不喜欢混乱,我想在终止和恢复脚本之间可能会有一段时间。因此,我首选的方法是在根目录中创建一个文件,其中包含已处理的文件列表:

rootdir = os.curdir if len(sys.argv) < 2 else sys.argv[1] # or something
logfilename = os.path.join(rootdir, 'processed')
if os.path.exists(logfilename):
    with open(logfilename, 'r') as logfile:
        processed = set(logfile.read().split())
else:
    processed = set()

filegen = (f for f in locate("*.pdf", rootdir) if f not in processed)
with open(logfilename, 'a') as logfile:
    for filename in filegen:
        do_something(filename)
        logfile.write(filename + '\n')

os.remove(logfilename)

当然,只有在失败后在同一目录上运行脚本时才有效;如果这是一个问题,David Wolever的解决方案是一个选项,或者您可以为日志文件设置固定位置。另一个有趣的方法是在每个遍历的目录中留下“痕迹”。你可能最终会重新处理几个文件,但这不会有很大的损失。