Есть список шаблонов слов. Каждая запись начинается с новой строки и содержит текстовые данные, состоящие из одного или нескольких слов. Например:
r'House',
r'Big Tree',
r'Word',
Далее скрипт берет имена файлов в папке, сравнивает каждый шаблон (текстовую строку данных) и ищет совпадения в имени файла. Если скрипт находит одно или несколько совпадений, он удаляет из имени файла все, кроме них (и расширения). А остальные совпадения переименовываются в соответствии с шаблоном, с которым производилось сравнение.
Поиск игнорирует регистр, специальные символы и различные разделители типа '-', '_', ',' (их может быть больше одного). При поиске по нескольким словам («Большое дерево») используются все возможные комбинации, например:
__big_tree_; big,tree_ и т. д.
Вот для примера исходные имена файлов:
- __big_tree_and_5_more_house_and_1_more_drawn_by_a_n_name__f95c144ac5d5cf0a0baa24d6593cc699.jpg
- Table-Home-Word-7325313.jpeg
- kiwi 40055619 virtual YouTube,Search EN, 100+ bookmarks 115480616_p0.png
- Big Tree House.jpeg
- Word.jpeg
- kiwi 40055619 virtual YouTube,Search EN, 100+ bookmarks 115480616_p0.png
I Я новичок в Python и не могу понять, как реализовать подобную задачу.
Все решения, найденные в Интернете, в основном работают с одним шаблоном, тогда как у меня их будут тысячи.
В идеале я пытаюсь реализовать вариант, при котором текстовая база данных будет храниться отдельно и отдельно универсальное регулярное выражение, позволяющее осуществлять поиск совпадений.
Всем спасибо заранее.
После долгих проб и ошибок лучшее, что я смог сделать, это следующий код:
К сожалению, он не полностью функционален и из-за перемещения файлов во временную папку дублируется файлы при перезапуске
import os
import re
import shutil
# Patterns that will be checked for matches in file names
patterns = [
r'House',
r'Bit Tree',
r'Word',
r'Word2',
r'Home',
]
# Filename filtering
def filter_filename(filename):
matches = []
for pattern in patterns:
match = re.search(pattern, filename)
if match:
matches.append(match.group())
return ' '.join(matches)
# File Renaming sending them to a temporary directory
def rename_files(directory):
temp_dir = os.path.join(directory, 'temp')
os.makedirs(temp_dir, exist_ok=True)
for filename in os.listdir(directory):
old_filepath = os.path.join(directory, filename)
if os.path.isfile(old_filepath):
base_filename, file_extension = os.path.splitext(filename)
new_filename = filter_filename(base_filename)
if new_filename:
new_filename = new_filename
new_filepath = os.path.join(temp_dir, new_filename)
# Adding a one for uniqueness of the name
count = 1
while os.path.exists(new_filepath):
if count < 9999:
new_filename_with_count = f"{new_filename} {count}{file_extension}"
new_filepath = os.path.join(temp_dir, new_filename_with_count)
count += 1
else:
break
shutil.move(old_filepath, new_filepath)
# Returning from a temporary folder
for filename in os.listdir(temp_dir):
temp_filepath = os.path.join(temp_dir, filename)
new_filepath = os.path.join(directory, filename)
shutil.move(temp_filepath, new_filepath)
os.rmdir(temp_dir)
# Directory for processing
directory = './.'
rename_files(directory)
Подробнее здесь: https://stackoverflow.com/questions/785 ... ll-mismatc