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

tho*_*yon 105 python file path

我正在尝试创建一个脚本来列出给定目录中的所有目录,子目录和文件.
我试过这个:

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)
Run Code Online (Sandbox Code Playgroud)

不幸的是,它无法正常工作.
我得到了所有文件,但不是完整的路径.

例如,如果dir结构是:

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

它会打印:

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

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

Eli*_*sky 190

使用os.path.join来连接的目录和文件:

for path, subdirs, files in os.walk(root):
    for name in files:
        print os.path.join(path, name)
Run Code Online (Sandbox Code Playgroud)

请注意连接的使用,path而不是root连接,因为使用root不正确.


在Python 3.4中,添加了pathlib模块以便于路径操作.所以相当于os.path.join:

pathlib.PurePath(path, name)
Run Code Online (Sandbox Code Playgroud)

优点pathlib是您可以在路径上使用各种有用的方法.如果您使用具体的Path变体,您还可以通过它们进行实际的OS调用,例如转到目录,删除路径,打开它指向的文件等等.

  • 对于有关“如何在 python 中递归获取所有文件”的许多问题,这是唯一有用的答案。 (2认同)

Iva*_*van 36

以防万一...获取目录中的所有文件和子目录匹配某些模式(例如*.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)
Run Code Online (Sandbox Code Playgroud)

  • 可以使用简单的 string .endswith() 方法完成相同的检查;)fnmatch 使用 unix-shell 通配符:https://docs.python.org/3/library/fnmatch.html (2认同)

Rot*_*eti 13

另一种选择是使用标准库中的glob模块:

import glob

path = "/home/patate/directory/targetdirectory/**"

for path in glob.glob(path, recursive=True):
    print(path)
Run Code Online (Sandbox Code Playgroud)

如果您需要迭代器,可以使用iglob作为替代:

for file in glob.iglob(my_path, recursive=True):
    # ...
Run Code Online (Sandbox Code Playgroud)


Tho*_*ner 8

这是一个单行:

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
Run Code Online (Sandbox Code Playgroud)

最外面的val for sublist in ...循环将列表展平为一维.该j循环收集每个文件名前缀的列表,并将其加入到当前的路径.最后,i循环遍历所有目录和子目录.

此示例使用硬编码路径./os.walk(...)电话,你可以补充你喜欢的任何路径字符串.

注意:os.path.expanduser和/或os.path.expandvars可以用于路径字符串之类的~/

扩展此示例:

它很容易添加文件基名测试和目录名测试.

例如,测试*.jpg文件:

... for j in i[2] if j.endswith('.jpg')] ...
Run Code Online (Sandbox Code Playgroud)

此外,不包括.git目录:

... for i in os.walk('./') if '.git' not in i[0].split('/')]
Run Code Online (Sandbox Code Playgroud)


Tre*_*ent 6

你应该在你的连接中使用'r'而不是'root'


Mon*_* Ng 6

无法发表评论,请在此处写答案。这是我所看到的最清晰的一行:

import os
[os.path.join(path, name) for path, subdirs, files in os.walk(root) for name in files]
Run Code Online (Sandbox Code Playgroud)


小智 5

更简单一点的一句话:

import os
from itertools import product, chain

chain.from_iterable([[os.sep.join(w) for w in product([i[0]], i[2])] for i in os.walk(dir)])
Run Code Online (Sandbox Code Playgroud)