如何从Python中的目录的所有子目录中只获取前50个文件?

时间:2017-11-13 05:35:05

标签: python file path

我正在尝试从特定目录的不同子目录中获取前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个文件吗?

3 个答案:

答案 0 :(得分:0)

获取列表理解的第一个n值。如果您只想在split上使用文件名/并取最后一个元素:

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)

答案 1 :(得分:0)

使用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])

答案 2 :(得分:0)

最好的方法是避免

  • 创建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):