Как объединить файлы с одинаковыми именами в Python? - PullRequest
1 голос
/ 09 мая 2019

Представьте, что у меня есть папка со следующими элементами: 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

1 Ответ

1 голос
/ 09 мая 2019

Вы можете сделать следующим образом.Начните с сопоставления чисел с 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
...