2015-11-03 68 views
3

我試圖使用os.walk爲了訪問給定文件夾內的所有文件和所有子文件夾。起初,我的代碼看起來是這樣的:os.walk()不打印/訪問文件

for root, dirs, files in os.walk("/home/DataScience"): 
    for dirName in dirs: 
      print dirName 

然而,上述輸出放文件變量到列表中 - 我需要它,在列表中每個對象,而不是重複。

於是我繼續前進,放在一個額外環路這樣的:

for root, dirs, files in os.walk("/home/DataScience"): 
    for dirName in dirs: 
     for fileName in files: 
      print dirName 

然而,現在沒有輸出。出於某種原因,似乎將附加循環設置爲使得第4行上的語句不能正確輸出。

我的問題是這樣的:爲什麼這個額外的循環消除我的輸出?

回答

4

您需要的目錄和文件的兩個分離循環:

for parent, dirs, files in os.walk("/home/DataScience"): 
    for dirname in dirs: 
     print dirname 
    for filename in files: 
     print filename 
+0

有趣 - 有什麼原因? –

+0

@ZR,因爲'dirs'是一個目錄列表,'files'是一個文件列表。 – falsetru

+0

我構建腳本的其餘部分的方式似乎要求我在遍歷一部分dirs之後迭代文件,因此爲什麼我非常熱衷於將一個文件嵌入到另一個文件中。 –

0

如果你只關心文件,而不是在一個目錄下的文件夾,你想與他們一起工作(比如,打開它們) ,這是你想要做什麼:

import os 
for root, subdirs, files in os.walk(directory): 
    for file in files: 
     print(root + os.sep + file) 
     # or whatever file operation you're interested in 

subdirs,或者你打電話dirs什麼,只是在root的文件夾列表。在每個步驟中,os.walk()將進入root的下一個子目錄,從而使得THAT root。所以,你不需要自己去瀏覽文件夾。

+0

你可以使用'os.path.join(root,file)'。 – falsetru

+0

@falsetru同樣適用。你知道這兩個選項是否有固有的優勢嗎?它們都可讀且具有相同的依賴關係。 – BlivetWidget

+0

根據[文檔](https://docs.python.org/2/library/os.html#os.sep):...請注意,知道這不足以解析或連接路徑名 - 使用os.path.split()和os.path.join()... – falsetru