Python 列出目录、子目录和文件

255 投票
11 回答
407174 浏览
提问于 2025-04-15 23:10

我正在尝试写一个脚本,用来列出一个指定文件夹里的所有目录、子目录和文件。

我试过这样做:

import sys, os

root = "/home/patate/directory/"
path = os.path.join(root, "targetdirectory")

for r, d, f in os.walk(path):
    for file in f:
        print(os.path.join(root, file))

可惜,这个方法不太好用。我能得到所有的文件,但它们的完整路径却没有。

举个例子,如果文件夹的结构是:

/home/patate/directory/targetdirectory/123/456/789/file.txt

那么它会输出:

/home/patate/directory/targetdirectory/file.txt

我需要的是第一个结果。

11 个回答

13

这里有一个简单的一行代码:

import os

[val for sublist in [[os.path.join(i[0], j) for j in i[2]] for i in os.walk('./')] for val in sublist]
# Meta comment to ease selecting text

最外层的 val for sublist in ... 循环把列表变成了一维的。j 循环收集每个文件的基本名称,并把它和当前的路径连接起来。最后,i 循环遍历所有的目录和子目录。

这个例子在 os.walk(...) 调用中使用了硬编码的路径 ./,你可以用任何你喜欢的路径字符串来替换。

注意:你可以使用 os.path.expanduser 和/或 os.path.expandvars 来处理像 ~/ 这样的路径字符串。

扩展这个例子:

添加文件基本名称测试和目录名称测试非常简单。

例如,测试 *.jpg 文件:

... for j in i[2] if j.endswith('.jpg')] ...

另外,还可以排除 .git 目录:

... for i in os.walk('./') if '.git' not in i[0].split('/')]
81

为了以防万一... 获取目录及其子目录中所有符合某个模式的文件(比如说,*.py 文件):

import os
from fnmatch import fnmatch

root = '/some/directory'
pattern = "*.py"

for path, subdirs, files in os.walk(root):
    for name in files:
        if fnmatch(name, pattern):
            print(os.path.join(path, name))
399

使用 os.path.join 可以把文件夹和文件名拼接在一起:

import os

for path, subdirs, files in os.walk(root):
    for name in files:
        print(os.path.join(path, name))

注意在拼接的时候用的是 path 而不是 root,因为用 root 是不对的。


在 Python 3.4 中,新增了一个叫 pathlib 的模块,让处理路径变得更简单。所以,和 os.path.join 相同的功能可以用:

pathlib.PurePath(path, name)

使用 pathlib 的好处是,你可以对路径使用很多有用的方法。如果你使用具体的 Path 变体,你还可以通过它们进行一些实际的操作,比如切换到某个文件夹、删除路径、打开它指向的文件等等,功能非常强大。

撰写回答