我有一个包含很多子目录的目录。
我正在浏览这些目录并找到一些文件并在这些文件上运行一些命令。如何将指针指向我完成的位置?有时这个过程会中断,下次我运行程序时,我想从我离开的地方开始。
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
答案 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的解决方案是一个选项,或者您可以为日志文件设置固定位置。另一个有趣的方法是在每个遍历的目录中留下“痕迹”。你可能最终会重新处理几个文件,但这不会有很大的损失。