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 |
|
False |
True |
|
True |
True |
|
True |
False |
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 |
52 s |
|
iter_files |
55 s |
|
iter_files_with_path |
13 s |
|
iter_files_with_path_skim |
3.5 s |
|
iter_download_nodes |
1.2 s |
|
iter_download_nodes |
2.7 s |
|
iter_download_nodes |
3.3 s |
|
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 |