walk¶
walk 文件系统意味着递归地访问目录和任何子目录。这是复制,搜索等相当普遍的要求。
要走一个文件系统(或目录),你可以构造一个 Walker
对象,并使用它的方法来做行走。下面是一个打印项目目录中每个Python文件的路径的示例:
>>> from fs import open_fs
>>> from fs.walk import Walker
>>> home_fs = open_fs('~/projects')
>>> walker = Walker(filter=['*.py'])
>>> for path in walker.files(home_fs):
... print(path)
然而,一般来说,如果你想定制步行算法的某些行为,你只需要构造一个Walker对象。这是因为你可以通过FS对象的 walk
属性来访问Walker对象的功能。下面是一个例子:
>>> from fs import open_fs
>>> home_fs = open_fs('~/projects')
>>> for path in home_fs.walk.files(filter=['*.py']):
... print(path)
注意上面的 files
方法不需要 fs
参数。 这是因为 walk
属性是一个属性,它返回一个 BoundWalker
对象,它将文件系统与一个walker相关联。
walk 方法¶
如果你在一个 BoundWalker
上调用 walk
属性,它将返回一个可迭代的 Step
命名tuples有三个值;目录的路径,目录的一个列表 Info
对象,以及一个 Info
对象的列表。下面是一个例子:
for step in home_fs.walk(filter=['*.py']):
print('In dir {}'.format(step.path))
print('sub-directories: {!r}'.format(step.dirs))
print('files: {!r}'.format(step.files))
注解
方法 BoundWalker
在 Walker
对象上调用相应的方法,使用 bound 文件系统。
walk
属性可能看起来是一个方法,但实际上是一个可调用的对象。它支持从步行提供不同信息的其他方便的方法。例如 files
,它返回一个可迭代的文件路径。下面是一个例子:
for path in home_fs.walk.files(filter=['*.py']):
print('Python file: {}'.format(path))
files
的称号是 dirs()
,它只返回目录的路径(忽略文件)。下面是一个例子:
for dir_path in home_fs.walk.dirs():
print("{!r} contains sub-directory {}".format(home_fs, dir_path))
info()
方法返回一个包含一个路径和一个 Info
对象的元组生成器。您可以使用 is_dir
属性来了解路径是否指向目录或文件。下面是一个例子:
for path, info in home_fs.walk.info():
if info.is_dir:
print("[dir] {}".format(path))
else:
print("[file] {}".format(path))
最后,下面是一个很好的例子,它计算你的主目录中的Python代码的字节数:
bytes_of_python = sum(
info.size
for info in home_fs.walk.info(namespaces=['details'])
if not info.is_dir
)
搜索算法¶
有两种用于搜索目录树的通用算法。第一种方法是“breadth”,它首先在目录树的顶部产生资源,然后进入子目录。第二个是“深度”,它产生最深的嵌套资源,并向后工作到最顶层目录。
一般来说,你只需要一个 depth 搜索,如果你将通过它们删除资源。默认 宽度 搜索是一种通常更有效的方式查看文件系统。你可以在大多数“Walker”方法中使用 search
参数指定你想要的方法。