2012-03-22 187 views
24

如何獲取可能在Python中有多個子文件夾的目錄中所有文件的絕對路徑?獲取目錄中所有文件的絕對路徑

我知道os.walk()遞歸給我一個目錄和文件的列表,但這似乎並沒有得到我想要的。

+0

可不可以給一個你期望什麼輸入和輸出的例子 – cwallenpoole 2012-03-22 05:18:59

回答

32

os.path.abspath確保路徑是絕對的。使用下面的輔助函數:

import os 

def absoluteFilePaths(directory): 
    for dirpath,_,filenames in os.walk(directory): 
     for f in filenames: 
      yield os.path.abspath(os.path.join(dirpath, f)) 
+0

我認爲在'os.walk'上只做一次abspath比在內部循環中做N次更好 – wim 2012-03-22 05:29:44

+0

這樣做可行,但只能通過「意外」。讀取'os.path.join'的合約,如果其中一個參數是絕對的,我找不到任何可以保證結果是絕對的地方,儘管這是一個合理的假設。 – phihag 2012-03-22 05:32:59

+0

最後有一個多餘的括號標記。應該是產量os.path.abspath(os.path.join(dirpath,f)) – jumbopap 2014-02-05 18:26:48

7
import os 

for root, dirs, files in os.walk(os.path.abspath("../path/to/dir/")): 
    for file in files: 
     print os.path.join(root, file) 
+0

好吧,我明白你的意思,只是我不想要這些文件,但想要特定的子目錄。我已經發布了下面的解決方案。 – 2016-02-19 10:25:34

3

您可以使用os.path.abspath()把相對路徑到絕對路徑:

file_paths = [] 

for folder, subs, files in os.walk(rootdir): 
    for filename in files: 
    file_paths.append(os.path.abspath(os.path.join(folder, filename))) 
+1

當你想加入'文件夾'時,這不會將'cwd'加入'filename'! – wim 2012-03-22 05:27:09

+0

謝謝,攪拌器。但我認爲它必須是.. os.path.abspath(os.path.join(文件夾,文件名)).. – madCode 2012-03-22 05:32:49

+1

爲什麼是的,它的確如此。謝謝,我修好了。 – Blender 2012-03-22 05:32:50

7

嘗試:

import os 

for root, dirs, files in os.walk('.'): 
    for file in files: 
     p=os.path.join(root,file) 
     print p 
     print os.path.abspath(p) 
     print 
+0

無論如何要做到這一點,而不捕獲隱藏的文件? – 2013-12-12 19:11:56

+0

@MarcelMarino'如果不是file.startswith('。')' – 2015-10-28 20:46:41

0

我想保持子目錄的細節,而不是文件,並希望只在他們一個XML文件子目錄。我能做到這樣:

for rootDirectory, subDirectories, files in os.walk(eventDirectory): 
    for subDirectory in subDirectories: 
    absSubDir = os.path.join(rootDirectory, subDirectory) 
    if len(glob.glob(os.path.join(absSubDir, "*.xml"))) == 1: 
     print "Parsing information in " + absSubDir 
2

如果你有Python的3.4或更新版本,您可以使用pathlib(或第三方反向移植,如果你有一箇舊的Python版本):

import pathlib 
for filepath in pathlib.Path(directory).glob('**/*'): 
    print(filepath.absolute()) 
相關問題