【问题标题】:How to get only first 50 files from all subdirectories of a directory in Python?如何从 Python 目录的所有子目录中仅获取前 50 个文件?
【发布时间】:2017-11-13 05:35:04
【问题描述】:

我正在尝试从特定目录的不同子目录中获取前 50 个 .jpg 文件。到目前为止,我只成功使用以下命令列表获取所有路径名:

import os
import os.path

for dirpath, dirnames, filenames in os.walk("."):
    for filename in [f for f in filenames if f.endswith(".jpg")]:
        print os.path.join(dirpath, filename)

谁能告诉我如何从子目录中只提取前 50 个文件?

【问题讨论】:

  • 您想要.log 还是.jpg?你的代码是log,你的问题描述是jpg
  • 对不起。它实际上是.jpg

标签: python file path


【解决方案1】:

获取列表理解的第一个 n 值。如果你只想要文件名,split on / 并取最后一个元素:

import os
import os.path

n = 50
fext = ".jpg"

for dirpath, dirnames, filenames in os.walk("."):
    for filename in [f for f in filenames if f.endswith(fext)][:n]:
        print (filename)

【讨论】:

  • 如果你想要文件名;只是print(filename)
  • 是的,确实如此。
【解决方案2】:

使用os.listdir 列出文件和目录。

使用os.path.isdir 获取目录。

以下代码获取每个子目录中 50 个 '.jpg 文件的完整路径。

target_dir = os.path.abspath('.')

sub_dir_list = [os.path.join(target_dir, one_dir) for one_dir in os.listdir(target_dir) if
            os.path.isdir(os.path.join(target_dir, one_dir))]

img_file_list = []
for sub_dir in sub_dir_list:
    img_file_list.extend([one_file for one_file in os.listdir(sub_dir) if one_file.endswith('.jpg')][:50])

【讨论】:

    【解决方案3】:

    最好的办法是避免

    • 创建一个list 理解
    • 使用幼稚切片[:50]对其进行切片

    创建了 2 个无用的列表,但性能不高。

    我建议使用生成器推导而不是列表推导来生成名称,并在其上使用islice。像这样没有创建临时列表。一次只能使用 1 个值:

    import itertools,os
    
    for dirpath, dirnames, filenames in os.walk("."):
        for filename in itertools.islice((f for f in filenames if f.endswith(".jpg")),50):
            print(os.path.join(dirpath, filename))
    

    还要小心:一些奇怪的文件系统不一定按名称对文件进行排序,也许您需要先对列表进行排序,然后再进行切片。

    for filename in itertools.islice(sorted([f for f in filenames if f.endswith(".jpg")]),50):
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-14
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 2014-11-10
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      相关资源
      最近更新 更多