2012-03-18 86 views
3

可以使用os.listdir('somedir')獲取somedir下的所有文件。但是,如果我想要的只是常規文件(不包括目錄),如殼牌下的find . -type f的結果。如何在Python中的目錄下列出常規文件(不包括目錄)

我知道可以使用[path for path in os.listdir('somedir') if not os.path.isdir('somedir/'+path)]來達到與此相關問題類似的結果:How to list only top level directories in Python?。只是想知道是否有更簡潔的方法來做到這一點。

回答

7

你可以使用os.walk,它返回路徑,文件夾和文件的元組:

files = next(os.walk('somedir'))[2] 
0

早期os.walk答案是完美的,如果你只是想在頂級目錄中的文件。如果你想子目錄文件太多,雖然(一拉find),你需要處理的每個目錄,例如:

def find_files(path): 
    for prefix, _, files in os.walk(path): 
     for name in files: 
      yield os.path.join(prefix, name) 

現在list(find_files('.'))是同樣的事情的清單find . -type f -print就會給你(list是因爲find_files是一個生成器,如果不明顯)。

3

我有幾個方法,我做這樣的任務。我無法評論解決方案的簡潔性。 FWIW在這裏他們是:

1.下面的代碼將採取所有以.txt結尾的文件。你可能想在這裏去掉「.endswith」部分

import os 
for root, dirs, files in os.walk('./'): #current directory in terminal 
    for file in files: 
      if file.endswith('.txt'): 
      #here you can do whatever you want to with the file. 

2,本代碼將假設路徑提供的功能和將所有.txt文件添加到列表中,如果有子目錄中路徑,它將追加子目錄下的那些文件到子文件

def readFilesNameList(self, path): 
    basePath = path 
    allfiles = [] 
    subfiles = [] 
    for root, dirs, files in os.walk(basePath): 
     for f in files: 
     if f.endswith('.txt'): 
      allfiles.append(os.path.join(root,f)) 
      if root!=basePath: 
       subfiles.append(os.path.join(root, f)) 

我知道代碼在本質上只是骨骼,但我認爲你可以得到的概貌。
後,如果你找到簡潔的方式! :)

相關問題