gpt4 book ai didi

Python os.walk,保存状态的方法?

转载 作者:行者123 更新时间:2023-12-01 05:46:51 28 4
gpt4 key购买 nike

我需要迭代文件服务器上的所有文件,并且我希望能够停止该进程并稍后在文件树中的任何位置恢复它。这可以用 os.walk 来完成,还是需要从头开始实现?

编辑:理想情况下,我希望解决方案是持久的,以便脚本可以停止并稍后恢复。

最佳答案

os.walk 是一个完全正常的生成器函数,这意味着您可以调用它,保存生成的生成器,并在闲暇时迭代它。例如:

w = os.walk(root)

for root, dirs, files in w:
if root == 'foo':
break
else:
# usual stuff

print('Hey, we found foo')

for root, dirs, files in w:
# usual stuff

您甚至可以w到一个函数,或者从一个函数返回它,或者将它用作您最喜欢的itertools函数的迭代器,等等。

<小时/>

不能用它做的一件大事就是腌制它。因此,如果您想将其持久保存到磁盘(或数据库),以便可以退出程序并从中断处恢复,或者将其发送到子进程以完成,或者其他什么,您不能这样做.

如果您有能力提前完成整个步行,而不是懒惰地进行(即,您不需要动态修剪步行,并且步行本身的时间和存储空间与时间和时间相形见绌)实际工作所需的存储空间),您只需保留 list(w) 即可。然后,您只需要跟踪该列表以及到目前为止您所到达的索引(或者只保留 wlist[index:] 而不是 wlist索引)。但对于某些用例,这是 Not Acceptable 。

幸运的是,walk是用纯Python实现的,而且非常简单,所以你可以从the source复制代码。并修改它以使状态持久。问题在于,通过“yield”的魔力,状态部分是隐式的,因此您必须将生成器从内到外翻转,或者将其转换为等效的纯迭代解决方案。这是一个开始:

class Walk(object):
def __init__(self, top):
self.queue = [top]
def __iter__(self):
return self
def __next__(self):
top = self.queue.pop(0)
names = os.listdir(top)
dirs, nondirs = [], []
for name in names:
if os.path.isdir(os.path.join(top, name)):
dirs.append(name)
else:
nondirs.append(name)
self.queue.extend(os.path.join(top, dir) for dir in dirs)
return top, dirs, nondirs

这不处理任何可选参数。 followlinks=Falseonerror 是微不足道的。处理 topdown=True 的动态修剪并不复杂(只需隐藏 topdirs,并在下一个开始时将子项排入队列)调用而不是这个的结束)。执行 topdown=False 会更痛苦一些,但仍然不会坏(您可以为标准递归到迭代转换创建一个显式状态堆栈,或者保留一个额外的双端队列,或者只是创建、存储和迭代新 Walk 对象的列表)。如果您不需要它们,请不要添加它们。

我相信这将pickle而无需任何更改。 (如果不是,那么要么是一个微不足道的 __getstate__ ,要么是一个近乎微不足道的 __reduce__ 无法正常工作。)如果您使用的是不同的持久性机制,实际上,您只需要persist 是,这是一个 Walk 对象,其 queueself.queue (它只是一个字符串列表),所以这应该很容易.

关于Python os.walk,保存状态的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15800310/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com