2012-03-18 90 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)) 

我知道代码在本质上只是骨骼,但我认为你可以得到的概貌。
后,如果你找到简洁的方式! :)

相关问题