Python - 获取目录中所有文件和子文件夹的相对路径

时间:2009-07-28 09:31:08

标签: python

我正在寻找一种获取特定文件夹中文件和(子)文件夹的相对路径的好方法。

对于我目前的方法,我使用的是os.walk()。它有效,但它对我来说似乎不是“pythonic”:

myFolder = "myfolder"
fileSet = set() # yes, I need a set()

for root, dirs, files in os.walk(myFolder):
    for fileName in files:
        fileSet.add(root.replace(myFolder, "") + os.sep + fileName)

还有其他建议吗?

由于

7 个答案:

答案 0 :(得分:62)

使用os.path.relpath()。这正是它的预期用途。

import os
root_dir = "myfolder"
file_set = set()

for dir_, _, files in os.walk(root_dir):
    for file_name in files:
        rel_dir = os.path.relpath(dir_, root_dir)
        rel_file = os.path.join(rel_dir, file_name)
        file_set.add(rel_file)

请注意,os.path.relpath()已添加到Python 2.6中,并且在Windows和Unix上受支持。

答案 1 :(得分:9)

myFolder = "myfolder"
fileSet = set() 

for root, dirs, files in os.walk(myFolder):
    for fileName in files:
        fileSet.add( os.path.join( root[len(myFolder):], fileName ))

答案 2 :(得分:3)

我认为os.walk是正确的选择。
也许root.replace(myFolder, "")应该更改为root.replace(myFolder, "", 1)以避免潜在的......你知道。
如果您已经获得了文件和(子)文件夹,os.path.commonprefix也值得一看。

答案 3 :(得分:2)

这可能是说实话的最佳方式:你可以使用glob来减少一定数量的图层,但如果你需要它递归,你必须walk

答案 4 :(得分:2)

你所做的是完全正确的,我认为应该这样做,但只是为了替代,这是一次尝试

import os

def getFiles(myFolder):
    old = os.getcwd()
    os.chdir(myFolder)

    fileSet = set()

    for root, dirs, files in os.walk(""):
        for f in files:
            fileSet.add(os.path.join(root, f))

    os.chdir(old)
    return fileSet

答案 5 :(得分:1)

如果您只是在寻找解决方案的替代方案,也可以使用os.listdir()

但基本上逻辑将保持不变:迭代文件 - 如果目录,遍历子目录。

答案 6 :(得分:0)

我是这样做的:

add()