05.拉取目录树

拉取目录树有很多的办法,相关函数大多被我封装在了 p115client.tool.iterdir 中。下面我尽量多地罗列各种方法,并做一些简要说明。

递归式拉取办法

(暂未封装,以后再补全)

穿透式拉取办法

1. iter_files

这个函数可以拉取某个目录下的所有文件,但不含路径,如果需要补充路径信息。可以对获得的结果使用 p115client.tool.iterdir.ensure_attr_path 函数。这个函数默认 max_workers=1,即不并发。

from p115client.tool import iter_files

2. iter_files_with_path

这个函数可以拉取某个目录下的所有文件,且包含路径,并且可以额外获得 "ancestors" 字段,作为某个文件的祖先节点的简略信息的列表。

from p115client.tool import iter_files_with_path

3. iter_files_with_path_skim

这个函数可以拉取某个目录下的所有文件,且包含路径,并且可以额外获得 "ancestors" 字段,作为某个文件的祖先节点的简略信息的列表。相比于 iter_files_with_path,这个函数获得的信息更少,但执行速度快得多,大约可快 3-5 倍。

from p115client.tool import iter_files_with_path_skim

4. iter_download_nodes

这个函数可以拉取某个目录下的所有文件,或者所有目录。这个函数的运行速度是所有函数中最快的,但信息也是最少的。这个函数默认 max_workers=1,即不并发。

from p115client.tool import iter_download_nodes

5. iter_files_shortcut

这个函数可以拉取某个目录下的所有文件,是其它 4 个函数的整合,会根据参数取值,分配到具体的函数。

from p115client.tool import iter_files_shortcut

is_skim

with_path

承担

False

False

iter_files

False

True

iter_files_with_path

True

True

iter_files_with_path_skim

True

False

iter_download_nodes

6. iter_dirs

这个函数可以拉取某个目录下的所有目录,但不含路径,如果需要补充路径信息。可以对获得的结果使用 p115client.tool.iterdir.ensure_attr_path 函数。这个函数默认 max_workers=1,即不并发。

from p115client.tool import iter_dirs

7. iter_dirs_with_path

这个函数可以拉取某个目录下的所有目录,且包含路径,并且可以额外获得 "ancestors" 字段,作为某个文件的祖先节点的简略信息的列表。

from p115client.tool import iter_dirs_with_path

8. traverse_tree

这个函数可以拉取某个目录下的所有文件和目录,但不含路径,如果需要补充路径信息。可以对获得的结果使用 p115client.tool.iterdir.ensure_attr_path 函数。这个函数直接基于 iter_download_nodes 封装,因此所能获得的信息非常简略。

from p115client.tool import traverse_tree

9. traverse_tree_with_path

这个函数可以拉取某个目录下的所有文件和目录,且包含路径,并且可以额外获得 "ancestors" 字段,作为某个文件的祖先节点的简略信息的列表。这个函数直接基于 iter_download_nodes 封装,因此所能获得的信息非常简略。

from p115client.tool import traverse_tree_with_path

10. iter_files_frament

这个函数可以拉取某个目录下的所有文件,但它会先统计一个目录内的文件数,如果大于一定的数值(或者超过一定时间未能获得统计结果),则会把任务进行拆分。因为一个目录内文件数越多,直接拉取的耗时越长,而且是非等比例增长,而是文件越多,越到后面的分页时间越久,可能是指数型增长。

from p115client.tool import iter_files_frament

11. iter_download_files

如果你想要下载某个目录中的所有文件,则可以使用这个函数,它可以获得文件在网盘所在目录的路径,但不含文件名。你可以在打开下载链接时,根据响应头中的信息来获得具体的文件名。

from p115client.tool import iter_download_files

12. export_dir_parse_iter

如果你仅仅想要获取所有的路径的列表,而不需要更具体的信息,可以使用导出目录树的功能。这个函数虽然反馈较慢,但是当文件数极多的情况下,例如 1000 万,依然可以成功拉取,而且伴随文件数量的增长,耗时可能是接近线性增长的,因此非常适合拉取特别大的目录。

from p115client.tool import export_dir_parse_iter

Benchmark

现在测试一个目录,它包含:文件夹 13562,文件 108665

from p115client.tool import iter_download_files

函数

耗时(5 次平均)

备注

iter_files

12 s

iter_files(..., max_workers=None, cooldown=0.5, app="android")

iter_files

52 s

iter_files(..., max_workers=None, cooldown=0.5, app="web")

iter_files

55 s

iter_files(..., max_workers=None, cooldown=0.5, app="open")

iter_files_with_path

13 s

iter_files_with_path_skim

3.5 s

iter_download_nodes

1.2 s

iter_download_nodes(..., max_workers=None, files=False)

iter_download_nodes

2.7 s

iter_download_nodes(..., max_workers=None, files=True)

iter_download_nodes

3.3 s

iter_download_nodes(..., max_workers=None, files=True, ensure_name=True)

iter_dirs

1.2 s

iter_dirs_with_path

1.2 s

traverse_tree

3.4 s

traverse_tree_with_path

3.4 s

iter_download_files

3.3 s

export_dir_parse_iter

1 min 23 s