首页 > 解决方案 > 从目录中过滤掉两个文件名略有不同但扩展名相同并传递给函数的文件

问题描述

Python中有没有办法从目录中迭代地选择2个文件(略有不同)并传递给函数?

例如 :

filename1 : file1_aaa.txt
filename2 : file1_bbb.txt

filename3 : file123_aaa.txt
filename4 : file123_bbb.txt

filename5 : 1_text_aaa.txt
filename6 : 1_text_bbb.txt

我必须在文件夹中迭代并选择 filename1 和 filename2,因为它具有相似的文件名(差异仅在下划线之后存在),将其传递给函数。然后,我将再次在文件夹中迭代并选择 filename3 和 filename4 并再次传递给一个函数。有没有一种pythonic方法可以做到这一点?

标签: pythonpython-3.x

解决方案


import os

def my_func(dir_list):
    for list in dir_list:
        print(list)

dir_files = os.listdir('path/to/dir/name')

# dir_files = ["file1_aaa.txt", "file1_bbb.txt", "file123_aaa.txt", "file123_bbb.txt", "1_text_aaa.txt", "1_text_bbb.txt"]
dirs_dict = {}
for dir in dir_files:
    cur_key = dir.split("_")[0]
    if cur_key in dirs_dict.keys():
        dirs_dict[cur_key].append(dir)
    else:
        dirs_dict[cur_key] = [dir]

for dirs_list in dirs_dict.values():
    my_func(dirs_list)

注1 - 在我看来,这个例子仍然不够,答案仍然可能过于适合这个例子。

注 2 - 选择基于第一个_字符之前的后缀。这意味着在你的例子中1file1file123

注 3 - 您可以更改cur_key变量以选择文件的哪个部分将是所有文件之间分离的关键

实施的另一种选择是:

import os
from itertools import groupby

def my_func(dir_list):
    for list in dir_list:
        print(list)

dir_files = os.listdir('path/to/dir/name')

# dir_files = ["file1_aaa.txt", "file1_bbb.txt", "file123_aaa.txt", "file123_bbb.txt", "1_text_aaa.txt", "1_text_bbb.txt"]
grouped = [list(v) for i,v in groupby(dir_files, lambda x: x.split("_")[0])]

for dirs_list in grouped:
    my_func(dirs_list)

groupby使用from更简洁、更短的单行版本itertools,无需在中间声明 dict


推荐阅读