【问题标题】:Python | normalizing filenames with a regex mapping list蟒蛇 |使用正则表达式映射列表规范化文件名
【发布时间】:2019-10-04 01:42:55
【问题描述】:

我想借助 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,这是合乎逻辑的:文件名已更改,因此“原始”文件没有已经存在了。


我已经用“映射列表”搜索了一个解决方案,但我没有找到任何方便实现给定目标的方法。

有人知道如何解决这个问题吗?

【问题讨论】:

    标签: python mapping filenames normalization


    【解决方案1】:

    如果您在每次替换后不调用os.rename(只需将replace 方法的结果分配到一个临时变量中),您的方法应该有效,例如:

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

    您还可以将替换项存储在字典中并将它们应用到嵌套循环中,例如(使用regular expressions):

    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)
    

    answer 显示了使用正则表达式一次执行所有替换的替代方法。

    【讨论】:

      猜你喜欢
      • 2021-12-08
      • 2011-06-08
      • 2018-08-26
      • 2011-03-08
      • 2022-07-06
      • 2021-02-15
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      相关资源
      最近更新 更多