pythonic方式访问目录列表中的每个文件

Kev*_*son 5 python

我有工作代码,如下所示:

# Wow. Much nesting. So spacebar
if __name__ == '__main__:
  for eachDir in list_of_unrelated_directories:
      for eachFile in os.listdir(eachDir):
          if eachFile.endswith('.json'):
            # do stuff here
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种更优雅的方式.我想不要让我的代码嵌套三层这样深,如果我可以把它变成一个单行的像

for each file that ends with .json in all these directories:
  # do stuff
Run Code Online (Sandbox Code Playgroud)

那将更加令人敬畏.我还编辑了这一点,指出目录不在同一个文件夹中.就像你可能在你的主文件夹和/ tmp文件夹中寻找.json文件一样.所以我不是试图通过单个文件夹递归移动.

Cod*_*all 1

最 Pythonic 的方法是(在我看来)编写一个函数来生成某种类型的文件并使用它。那么你的调用代码就非常清晰简洁了。 其他一些答案非常简洁,但令人难以置信;在您的实际代码中,您应该重视清晰性而不是简洁性(当然,当您可以同时获得两者时,这是首选)。

这是函数:

import os

def files_from_directories(directories, filetype):
    """Yield files of filetype from all directories given."""
    for directory in directories:
        for file in glob.glob(os.path.join(directory, '*' + filetype))
            yield file
Run Code Online (Sandbox Code Playgroud)

现在你的调用代码实际上是一行代码:

# What a good one-liner!!!!
for json_file in files_from_directories(directories, '.json'):
    # do stuff
Run Code Online (Sandbox Code Playgroud)

现在你有了一句台词,而且是一句非常清晰的台词。另外,如果您想处理任何其他类型的文件,您只需对不同的文件类型重用该函数即可。