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)
不幸的是,它无法正常工作.
我得到了所有文件,但不是完整的路径.
例如,如果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)
请注意连接的使用,path而不是root连接,因为使用root不正确.
在Python 3.4中,添加了pathlib模块以便于路径操作.所以相当于os.path.join:
pathlib.PurePath(path, name)
优点pathlib是您可以在路径上使用各种有用的方法.如果您使用具体的Path变体,您还可以通过它们进行实际的OS调用,例如转到目录,删除路径,打开它指向的文件等等.
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)
Rot*_*eti 13
另一种选择是使用标准库中的glob模块:
import glob
path = "/home/patate/directory/targetdirectory/**"
for path in glob.glob(path, recursive=True):
    print(path)
如果您需要迭代器,可以使用iglob作为替代:
for file in glob.iglob(my_path, recursive=True):
    # ...
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('/')]
无法发表评论,请在此处写答案。这是我所看到的最清晰的一行:
import os
[os.path.join(path, name) for path, subdirs, files in os.walk(root) for name in files]
小智 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)])