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

2024-04-19 15:23:57 发布

您现在位置: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)

不幸的是它不能正常工作。
我得到了所有的文件,但没有它们完整的路径。

例如,如果dir结构是:

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

它会打印:

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

我需要的是第一个结果。任何帮助都将不胜感激!谢谢。


Tags: 文件pathin目录txthomeforos
3条回答

使用os.path.join连接目录和文件名称

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变量,您还可以通过它们执行实际的操作系统调用,比如切换到目录、删除路径、打开它指向的文件等等。

以防万一。。。正在获取目录和子目录中与某个模式匹配的所有文件(例如:“.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)

这里有一行:

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循环遍历所有目录和子目录。

这个例子使用了^{}调用中的硬编码路径./,您可以补充任何您喜欢的路径字符串。

注意:^{}和/或^{}可用于路径字符串,如~/

扩展此示例:

它很容易添加文件basename测试和directoryname测试。

例如,测试*.jpg文件:

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

另外,排除.git目录:

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

相关问题 更多 >