列出给定起始目录的子目录中的所有文件
List all files in subdirectories from a given start directory
假设我有一个这样的目录树:
a/
├── b
│ ├── d.png
│ └── e
│ └── f.png
└── c.png
我想要的输出是:
如果我想在 a/b/
中搜索文件:
b/d.png
& b/e/f.png
如果是 a/
:a/c.png
a/b/d.png
a/b/e/f.png
我知道如何使用 os.walk 列出子目录中的所有文件,我搜索了很多类似我的情况,但我没有找到。
这是我最近的尝试:
path = "a/b"
pathBase = os.path.basename(path)
for p, dirs, files in os.walk(path):
for file in files:
print(os.path.join(p.replace(path, pathBase),file))
虽然这对 a/b/
可以正常工作,但对 a/
无效。
a
的输出是:c.png
b/d.png
b/e/f.png
这与预期不符。
如果您从 path
中去除尾部斜杠,您的代码将(几乎)正确,但无论如何您应该使用 os.path.relpath
来计算相对文件路径:
import os
def f(path):
path = path.rstrip(os.sep)
parent = os.path.dirname(path)
for p, dirs, files in os.walk(path):
for file in files:
print(os.path.relpath(os.path.join(p, file), parent))
就其价值而言,pathlib
使路径操作更容易:
from pathlib import Path
def f(path):
path = Path(path)
for x in path.rglob('*'):
if not x.is_dir():
print(x.relative_to(path.parent))
假设我有一个这样的目录树:
a/
├── b
│ ├── d.png
│ └── e
│ └── f.png
└── c.png
我想要的输出是:
如果我想在 a/b/
中搜索文件:
b/d.png
& b/e/f.png
如果是 a/
:a/c.png
a/b/d.png
a/b/e/f.png
我知道如何使用 os.walk 列出子目录中的所有文件,我搜索了很多类似我的情况,但我没有找到。
这是我最近的尝试:
path = "a/b"
pathBase = os.path.basename(path)
for p, dirs, files in os.walk(path):
for file in files:
print(os.path.join(p.replace(path, pathBase),file))
虽然这对 a/b/
可以正常工作,但对 a/
无效。
a
的输出是:c.png
b/d.png
b/e/f.png
这与预期不符。
如果您从 path
中去除尾部斜杠,您的代码将(几乎)正确,但无论如何您应该使用 os.path.relpath
来计算相对文件路径:
import os
def f(path):
path = path.rstrip(os.sep)
parent = os.path.dirname(path)
for p, dirs, files in os.walk(path):
for file in files:
print(os.path.relpath(os.path.join(p, file), parent))
就其价值而言,pathlib
使路径操作更容易:
from pathlib import Path
def f(path):
path = Path(path)
for x in path.rglob('*'):
if not x.is_dir():
print(x.relative_to(path.parent))