2009-07-28 158 views
25

我正在尋找一種獲取特定文件夾中文件和(子)文件夾的相對路徑的好方法。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) 

其他建議?

感謝

+0

os.walk有什麼問題?它是圖書館的一流部分。 – 2009-07-28 10:06:49

+0

那麼,我猜想沒有什麼不對。但它似乎並不那麼「正確」。我不熟悉python及其標準庫,這是問題:) 但所有的答案都提供了一些有關如何改進我的代碼段的有用建議。 – vobject 2009-07-28 10:26:55

回答

50

使用os.path.relpath()。這正是它的預期用途。

import os 
rootDir = "myfolder" 
fileSet = set() 

for dir_, _, files in os.walk(rootDir): 
    for fileName in files: 
     relDir = os.path.relpath(dir_, rootDir) 
     relFile = os.path.join(relDir, fileName) 
     fileSet.add(relFile) 

注意os.path.relpath()在Python 2.6中添加支持Windows和Unix。

2

那可能是最好的辦法是誠實的:你可以用glob去一定層數下來,但如果你需要它是遞歸的,你必須walk

1

你在做什麼是完全正確的,我認爲應該這樣做的方式,只是替代的緣故,這裏是試圖

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 
3

我認爲os.walk這裏是正確的選擇。
也許root.replace(myFolder, "")應更改爲root.replace(myFolder, "", 1)以避免潛在的問題。你懂。
如果您已經獲得了文件和(子)文件夾,os.path.commonprefix也值得一看。

+0

感謝您提及replace()的第三個參數。 – vobject 2009-07-28 10:08:51

8
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)) 
1

如果您正在尋找解決方案的替代方案,還可以使用os.listdir()

但基本上,邏輯將保持不變:遍歷文件 - 如果目錄,遍歷子目錄。

相關問題