如何在Python目录下仅列出常规文件(不包括目录)

时间:2012-03-18 18:01:40

标签: python filesystems

可以使用os.listdir('somedir')获取somedir下的所有文件。但是,如果我想要的只是常规文件(不包括目录),比如shell下find . -type f的结果。

我知道可以使用[path for path in os.listdir('somedir') if not os.path.isdir('somedir/'+path)]来获得与此相关问题类似的结果:How to list only top level directories in Python?。只是想知道是否有更简洁的方法可以这样做。

3 个答案:

答案 0 :(得分:7)

您可以使用os.walk,它返回路径,文件夹和文件的元组:

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

答案 1 :(得分: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))

我知道代码本质上只是骨架,但我认为你可以得到一般的图片 如果你发现简洁的方式发布! :)

答案 2 :(得分:0)

如果您只想要顶级目录中的文件,则较早的os.walk答案是完美的。如果您也想要子目录的文件(la 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是一个生成器,如果不明显的话)。