python - 如何在python中将相似文件名的文件组合在一起?
问题描述
想象一下,我有一个包含以下项目的文件夹: default.xml df_ak01.1001.jpg df_ak01.1002.jpg df_ak01.1003.jpg df_ak01.1005.jpg df_ak01.1006.jpg
(在这里我们可以看到 df_ak01.1004.jpg 丢失了,如果目录中有数千个文件,这很难发现)程序应该能够在任何目录上运行,并且文件名部分(这里)df_ak01 可以变化每次 。有人可以帮我解决这个问题。
我能够获得程序当前正在运行的当前工作目录,并且我想不出一个逻辑,如果它们是通用的并且几乎是未知的,我该如何归档名称部分。
我刚刚创建了一个正则表达式来搜索名称中带有 df_ak01 的文件并列出它们(但这不是一个好方法)。但是我如何实现查找丢失的图像仍然没有成功。
import os
import re
current = os.getcwd()
#I've just implemented the listing of files that match 'df_ak01'
a = [x for x in os.listdir(current) if re.match('df_ak01.*.jpg',x)]
print a
所以我想得到类似的输出:
1 default.xml
3 df_ak01.%04d.jpg 1001-1003
2 df_ak01.%04d.jpg 1005-1006
解决方案
您可以执行以下操作。从匹配 4 位或更多位的数字开始(正则表达式"\d{4,}"
匹配 4 位或更多位)并提取所有数字。然后使用more_itertools.consecutive_groups将连续的数字组合在一起,并创建结果列表,然后打印它
import re
import os
from more_itertools import consecutive_groups
files = ["default.xml", "df_ak01.1001.jpg", "df_ak01.1002.jpg", "df_ak01.1003.jpg", "df_ak01.1005.jpg", "df_ak01.1006.jpg"]
#Pattern to match numbers with 4 or more digits
pattern = re.compile("\d{4,}")
#Extract all numbers
a = [int(pattern.search(x).group(0)) for x in files if pattern.search(x)]
#[1001, 1002, 1003, 1005, 1006]
#Group consecutive numbers together
cons_groups = [list(group) for group in consecutive_groups(a)]
#[[1001, 1002, 1003], [1005, 1006]]
#Create result list
result = [ [len(x), '{}-{}'.format(x[0], x[-1])] for x in cons_groups]
#[[3, '1001-1003'], [2, '1005-1006']]
#Print the result list
for item in result:
print('{} df_ak01.%04d.jpg {}'.format(item[0], item[1]))
输出将是
3 df_ak01.%04d.jpg 1001-1003
2 df_ak01.%04d.jpg 1005-1006
推荐阅读
- excel - Excel 筛选器不适用于合并单元格
- sql-server - 如何定义 SQL Server 用户的优先级(高/中/低)?
- netcdf - NetCDF:及时将变量设置为常数
- angular - 带复选框的离子表
- mysql - SELECT 和 INSERT 语句中 str_to_date 的不同行为
- c# - unity UI - 轮播菜单
- laravel - Laravel (5.4) 在有效的 API 路由上抛出 404
- java - 在java中使用多个键创建地图
- javascript - 对于用 javascript 编写的单元测试,SonarQube 不支持 cobertura-coverage.xml 格式
- rdlc - 使用 LoadReportDefinition 时未加载子报表