我正在尝试编写一个简单的Python脚本,它将所有子目录中的index.tpl复制到index.html(有一些例外)。
通过尝试获取子目录列表,我陷入了困境。
我对各种功能进行了 速度测试 ,以将 完整路径 返回到所有当前子目录。
tl; dr: 始终使用scandir
:
list_subfolders_with_paths = [f.path for f in os.scandir(path) if f.is_dir()]
奖励:使用,scandir
您也可以只使用f.name
而不是来获取文件夹名称f.path
。
该函数(以及下面的所有其他函数)将不会使用 自然排序
。这意味着将对结果进行如下排序:1、10、2。要进行自然排序(1、2、10),请查看http://codingdict.com/questions/169984
结果 :
scandir
是:比walk
快3倍,比listdir
(带过滤器)快32倍,比Pathlib
快listdir
35倍,快36倍,比快37倍(!)glob
。
Scandir: 0.977
Walk: 3.011
Listdir (filter): 31.288
Pathlib: 34.075
Listdir: 35.501
Glob: 36.277
已在W7x64,Python 3.8.1中测试。带有440个子文件夹的文件夹。
如果您想知道是否listdir
可以通过不两次执行os.path.join()来加快速度,是的,但是这种区别基本上是不存在的。
码:
import os
import pathlib
import timeit
import glob
path = r"<example_path>"
def a():
list_subfolders_with_paths = [f.path for f in os.scandir(path) if f.is_dir()]
# print(len(list_subfolders_with_paths))
def b():
list_subfolders_with_paths = [os.path.join(path, f) for f in os.listdir(path) if os.path.isdir(os.path.join(path, f))]
# print(len(list_subfolders_with_paths))
def c():
list_subfolders_with_paths = []
for root, dirs, files in os.walk(path):
for dir in dirs:
list_subfolders_with_paths.append( os.path.join(root, dir) )
break
# print(len(list_subfolders_with_paths))
def d():
list_subfolders_with_paths = glob.glob(path + '/*/')
# print(len(list_subfolders_with_paths))
def e():
list_subfolders_with_paths = list(filter(os.path.isdir, [os.path.join(path, f) for f in os.listdir(path)]))
# print(len(list(list_subfolders_with_paths)))
def f():
p = pathlib.Path(path)
list_subfolders_with_paths = [x for x in p.iterdir() if x.is_dir()]
# print(len(list_subfolders_with_paths))
print(f"Scandir: {timeit.timeit(a, number=1000):.3f}")
print(f"Listdir: {timeit.timeit(b, number=1000):.3f}")
print(f"Walk: {timeit.timeit(c, number=1000):.3f}")
print(f"Glob: {timeit.timeit(d, number=1000):.3f}")
print(f"Listdir (filter): {timeit.timeit(e, number=1000):.3f}")
print(f"Pathlib: {timeit.timeit(f, number=1000):.3f}")
问题内容: 有没有办法在Python中返回当前目录中所有子目录的列表? 我知道您可以使用文件来执行此操作,但是我需要获取目录列表。 问题答案: 你是指直接子目录,还是树下的每个目录? 无论哪种方式,你都可以使用以下方法: 将为每个子目录生成一个元组。该三元组中的第一个条目是目录名称,因此 应该递归地给你所有的子目录。 请注意,元组中的第二个条目是该条目在第一个位置的子目录的列表,因此你可以改用它,
问题内容: 我想在当前位置的子目录之间进行迭代,并分别gzip每个文件。为了在目录中压缩文件,我使用 但这仅适用于当前目录,而不适用于当前目录的子目录。如何重写以上语句,以便也将所有子目录中的文件压缩? 问题答案: 不需要循环或除和以外的任何东西: 这将查找当前目录中及其下所有名称不以扩展名结尾的常规文件(即,所有尚未压缩的文件)。它分别在每个文件上调用。 编辑的基础上,从评论: 花括号()替换为
问题内容: 我正在用Python练习Selenium,我想使用Selenium获取网页上的所有链接。 例如,我想要http://psychoticelites.com/上所有标签的属性中的所有链接。 我写了一个脚本,它正在工作。但是,它给了我对象地址。我尝试使用标签来获取值,但是,它不起作用。 我当前的脚本: 问题答案: 好吧,您只需要遍历列表即可: 返回元素列表(注意“ elements”的拼写
问题内容: 我正在用Python练习Selenium,我想使用Selenium获取网页上的所有链接。 例如,我想要http://psychoticelites.com/上所有标签的属性中的所有链接。 我写了一个脚本,它正在工作。但是,它给了我对象地址。我尝试使用标签来获取值,但是,它不起作用。 我当前的脚本: 问题答案: 好吧,您只需要遍历列表即可: 返回元素列表(注意“ elements”的拼写
问题内容: 如何获取给定目录的所有子目录而没有文件(当前目录)或(父目录),然后使用函数中的每个目录? 问题答案: 您可以将glob()与选项一起使用 要么
有没有办法使用来获取JAR目录中的“子资源”列表? 但我却找不到办法获得“孩子”资源。