python - 从目录中过滤掉两个文件名略有不同但扩展名相同并传递给函数的文件
问题描述
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方法可以做到这一点?
解决方案
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 - 选择基于第一个_
字符之前的后缀。这意味着在你的例子中1
,file1
和file123
注 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
推荐阅读
- android - 在分屏的第一个窗口中启动外部应用程序
- node.js - 如何将图像插入 CouchDB
- php - 为什么我的 post 方法在 Laravel 中不起作用?
- vue.js - VueJS 模板中的元素引用 self
- python - 在 Python Socket 上通过 TCP 将 txt 文件发送到服务器
- python-3.x - python从给定位置的字符串中删除字符串
- node.js - NestJS - 每个模块使用多个 MongoDB 连接
- sublimetext3 - 启动时自动加载 Sublime 工作区
- java - Quarkus 开发模式下的 Maven 多模块项目
- ruby-on-rails - 有没有办法根据特定顺序对 Rails 中的国家/地区进行排序?