【发布时间】:2020-12-03 21:59:08
【问题描述】:
我知道如何使用各种方法递归列出d:\temp 的所有文件/文件夹,请参阅How to use glob() to find files recursively?。
但通常我想避免在结果中使用 d:\temp\ 前缀,而是使用到此基础的相对路径。
这可以通过:
-
import os, glob for f in glob.glob('d:\\temp\\**\\*', recursive=True): print(os.path.relpath(f, 'd:\\temp')) -
与
f.lstrip('d:\\temp\\')同义,删除此前缀 -
import pathlib root = pathlib.Path("d:\\temp") print([p.relative_to(root) for p in root.glob("**/*")])
这 3 个解决方案有效。但事实上,如果您阅读了glob.py 的来源,它确实会累积/加入所有路径的各个部分。所以上面的解决方案是......“删除之前刚刚添加的东西”!它有效,但不是很优雅。 pathlib 同上,relative_to 删除前缀。
问题:如何修改接下来的几行以在输出中不包含d:\temp(不删除之前连接的内容!)?
import os
def listpath(path):
for f in os.scandir(path):
f2 = os.path.join(path, f)
if os.path.isdir(f):
yield f2
yield from listpath(f2)
else:
yield f2
for f in listpath('d:\\temp'):
print(f)
#d:\temp\New folder
#d:\temp\New folder\New Text Document - Copy.txt
#d:\temp\New folder\New Text Document.txt
#d:\temp\New Text Document - Copy.txt
#d:\temp\New Text Document.txt
【问题讨论】:
-
风格提示:在路径上使用原始字符串以避免所有转义:
r'd:\temp\**\*'。 (顺便说一句,Windows 早在 1995 年就支持路径中的正斜杠,你也可以这样做r'd:/temp/**/*')
标签: python glob os.path pathlib