Python |нормализация имен файлов с помощью списка сопоставления регулярных выражений - PullRequest
0 голосов
/ 04 октября 2019

Я хотел бы нормализовать имена файлов с помощью - как я бы назвал - «списка отображения» в python.


Например, у меня есть несколько файлов, названных так:

Abb. 1 - Streßfaktor   ìmpersóna.jpg
Abb. 2 - Änderungsverlauf.jpg
Abb. 3 — Senôjarîolé.jpg

Моя цель заключается в следующем:

Abb_1_Stressfaktor_impersona.jpg
Abb_2_Aenderungsverlauf.jpg
Abb_3_Senojariole.jpg

Правила довольно просты и могут храниться в «списке отображения» с регулярными выражениями:

"\s+|.|,|;|-|–|—" : "_"
"ß" : "ss"
"ä" : "ae"
"ü" : "ue"
"ö" : "oe"
"á|â|à|ā|ă|ą|ã|å" : "a"
"í|í|ì|ï|ĩ|ī|ĭ|į|ǐ" : "i"
"_+" : "_"

Итак, перед : есть строка поиска в регулярном выражении, после : есть строка замены.


Я уже пробовал:

import os

current_path = os.getcwd()
print('Current path: %s' %current_path)

filenames = os.listdir(current_path)
for filenamen in filnames:
    os.rename(filename, filename.replace(" ", "_"))
    os.rename(filename, filename.replace(".", "_"))
    os.rename(filename, filename.replace(",", "_"))
    os.rename(filename, filename.replace(";", "_"))
    os.rename(filename, filename.replace("-", "_"))
    os.rename(filename, filename.replace("–", "_"))
    os.rename(filename, filename.replace("—", "_"))
    os.rename(filename, filename.replace("ß", "ss"))
    os.rename(filename, filename.replace("ä", "ae"))
    os.rename(filename, filename.replace("ü", "ue"))
    os.rename(filename, filename.replace("ö", "o"))
    os.rename(filename, filename.replace("á", "a"))
    os.rename(filename, filename.replace("â", "a"))
    os.rename(filename, filename.replace("à", "a"))
    …

Но проблемас этим кодом, что, как только первая замена сделана, я получаю FileNotFoundError , что логично: имя файла было изменено, и, следовательно, «оригинальный» файл больше не существует.


Я уже искал решение с «списком сопоставлений», но не нашел ничего удобного для достижения поставленной цели.

Кто-нибудь знает, как решить эту проблему?

1 Ответ

0 голосов
/ 04 октября 2019

Если вы не вызываете os.rename после каждой замены (просто присваиваете результат метода replace во временной переменной), ваш подход должен работать, например:

filenames = os.listdir(current_path)
new_name = ""
for filename in filenames:
    new_name = filename.replace(".", "_").replace(",", "_")  # ...
    os.rename(filename, new_name)

Вы можететакже сохраняйте замены в словаре и применяйте их во вложенном цикле, например (используя регулярные выражения ):

replacements = {
    "ß": "ss",
    "ä": "ae",
    # ...
}

filenames = os.listdir(current_path)
new_name = ""
for filename in filenames:
    new_name = filename
    for key, value in replacements.items():
        new_name = re.sub(key, value, new_name)
    os.rename(filename, new_name)

Альтернативный подход, который выполняет все замены одновременно с использованием регулярных выражений,показано в этом ответе .

...