- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要迭代文件服务器上的所有文件,并且我希望能够停止该进程并稍后在文件树中的任何位置恢复它。这可以用 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=False
和 onerror
是微不足道的。处理 topdown=True
的动态修剪并不复杂(只需隐藏 top
和 dirs
,并在下一个开始时将子项排入队列)调用而不是这个的结束)。执行 topdown=False
会更痛苦一些,但仍然不会太坏(您可以为标准递归到迭代转换创建一个显式状态堆栈,或者保留一个额外的双端队列,或者只是创建、存储和迭代新 Walk
对象的列表)。如果您不需要它们,请不要添加它们。
我相信这将pickle
而无需任何更改。 (如果不是,那么要么是一个微不足道的 __getstate__
,要么是一个近乎微不足道的 __reduce__
无法正常工作。)如果您使用的是不同的持久性机制,实际上,您只需要persist 是,这是一个 Walk
对象,其 queue
是 self.queue
(它只是一个字符串列表),所以这应该很容易.
关于Python os.walk,保存状态的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15800310/
不幸的是,这段代码比“os.walk”运行得慢,但为什么呢? 会不会是“for”循环导致运行缓慢? “像‘os.walk’一样工作的代码:(“os.walk”函数做它做的事) 注意:我写作是为了提升自
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭11 年前。 Improve th
我不确定我是否能正确表达这个问题,但就是这样...... 我想编写一个示例,其中小点具有它们移动所依据的速度 - 而且,还有一个随机运动叠加到“正确”运动上。使用下面的 Processing 代码,我
我正在写 Walk function in the go tutorial基本上按顺序遍历树。我的作品: package main import ( "fmt" "code.googl
我是 AngularJS 的新手,但我真的很喜欢 AngularJS 的工作方式,所以我想将它部署为我的 Google 云端点后端的客户端。然后我立即遇到两个问题: 1、放在哪里myCallback
使用 python 3.5 时 os.walk()并查看 dirname 输出,我得到了很多空列表(返回 [ ] )。我不知道为什么。 import os tdir = '/home/pontiac/
我终于让我的 Files.walk 开始工作了,我的问题是是否有任何方法可以识别收集到列表中的文件是否来自子文件夹或主文件夹,因为这些文件有删除功能,但来自子文件夹的文件用户不应删除文件夹。 pri
我需要在 os.walk 进程中获取当前目录。当只有一个子目录级别时它可以工作,但当有更多子目录级别时它会失败。请指教... [代码] # AFFECTS everything reachable f
当我 snmpWalk 一个 ip 时,需要 5 秒。但如果我在 for 循环中发送 snmpWalk 请求,步行时间就会增加。以多线程方式使用 snmp 或仅使用 ExecutorService 是
我正在尝试计算大量父目录中特定文件夹中的文件数量。每个项目都包含相同的文件夹结构: C:/Projects 2019 Project A Communi
我需要迭代文件服务器上的所有文件,并且我希望能够停止该进程并稍后在文件树中的任何位置恢复它。这可以用 os.walk 来完成,还是需要从头开始实现? 编辑:理想情况下,我希望解决方案是持久的,以便脚本
我有一个包含数千个文件的文件夹。我需要将每个文件的文件名与另一个数组中的列进行匹配。 import os filenames = [] for files in os.walk("Directory"
我想打开一个文件夹中的一系列子文件夹,找到一些文本文件并打印文本文件的一些行。我正在使用这个: from glob import glob import fileinput with open('ou
我是 stackoverflow 的新手。在编写以下代码时,我从该论坛获得了很多帮助。下面的代码搜索系统驱动器上的所有目录/子目录,但在查找“D”驱动器时,它只查找我运行该程序的文件夹后面的那些目录和
我有一个文件夹,其中有对应10个不同类的子文件夹,这些子文件夹的名称就是我的标签。我想出了以下代码将图像读入 Numpy 数组并保存标签。 import numpy as np import pand
我目前正在尝试编写一个简单的Python程序,该程序循环遍历一堆子目录,查找java文件并打印一些有关某些关键字使用次数的信息。我已经设法让这个在大部分情况下工作。我遇到的问题是打印有关更高目录的总体
我想遍历一个目录并搜索给定的文件。这是我编写的一些代码: import os def find(filename, path): for root, dirs, files in os.walk(
我不确定这种方法在 C 中是否正确(详细为 Atmel xmega 的 avrgcc)。数据是 ASCII 字符串。 #define BUFFER_SIZE 64 char dataBuffer[2
使用 Unity2017.3.1f1 Personal(64 位)为 Android 构建 VR 应用程序,使用 Cardboard VR SDK。该应用的目的是让用户以身临其境的方式可视化数据。 目
这是我要解决的问题。我有一个简单的 HTML 页面: Hello World
我是一名优秀的程序员,十分优秀!