Python 列出目录、子目录和文件
我正在尝试写一个脚本,用来列出一个指定文件夹里的所有目录、子目录和文件。
我试过这样做:
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
变体,你还可以通过它们进行一些实际的操作,比如切换到某个文件夹、删除路径、打开它指向的文件等等,功能非常强大。