首页 > 解决方案 > 如何在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

标签: pythonregexpython-2.7formattingstring-formatting

解决方案


您可以执行以下操作。从匹配 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

推荐阅读