可以使用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?。只是想知道是否有更简洁的方法可以这样做。
答案 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是一个生成器,如果不明显的话)。