python - 使用 python 重命名文件时出现问题,某些字符拒绝更改。(可能是更改编码时出现问题)

标签 python encoding rename filenames

我四处搜索,但是虽然我看到了一些与我类似的问题,但我还没有获得足够的信息来解决我的问题......

我的一位同事正在 WordPress 网站上工作,他们在查看某些图像时遇到问题(它们不会在幻灯片放映中显示)。 没有显示的图像是用希腊语命名的图像,因此他们猜测这是一个命名问题。 所以我想我可以通过编写一个脚本来将所述图像从希腊语大规模重命名为希腊语(一种使用拉丁字符的希腊语形式,在互联网早期在希腊人中很流行 - 对于那些不熟悉该术语的人来说) )。

我已经用各种希腊字符测试了该脚本,它运行良好,包括希腊语言特有的各种符号。

当我在想要重命名的图像上运行脚本时,某些图像显示了问题。他们会将一些重音字符重命名为法语重音字符(例如 ά 到 à 等),但是当我将这些字符添加到字典中(我使用字典来解析名称并替换希腊字母)时,他们拒绝更改。

例如,在这个文件名“palaiá-póli-4-768x480”上,我运行了脚本两次:第一次将其从“Παλαιά-Πόλη-4-768x156”转换为上面的名称,第二次运行什么也没做,甚至将 "á":"a"和 "ó":"o"添加到字符映射后(之前不存在,因为 ó 和 á 不是希腊字符。)

我的脚本如下:

import os


char_migrate = {
    "ς": 's',
    'ε': 'e', 'ρ': 'r', "τ": "t", "υ": "y", "θ": "th", "ι": "i", "ο": "o", "π": "p", "α": "a",
    "σ": "s", "δ": "d", "φ": "f", "γ": "g", "η": "i", "ξ": "x", "κ": "k", "λ": "l",
    "ζ": "z", "χ": "x", "ψ": "ps", "ω": "o", "β": "v", "ν": "n", "μ": "m",
    "Ε": "e", "Ρ": "r", "Τ": "t", "Υ": "y", "Θ": "th", "Ι": "i", "Ο": "o", "Π": "p", "Α": "a",
    "Σ": "s", "Δ": "d", "Φ": "f", "Γ": "g", "Η": "i", "Ξ": "x", "Κ": "k",
    "Λ": "l", "Ζ": "z", "Χ": "x", "Ψ": "ps", "Ω": "o", "Β": "v", "Ν": "n", "Μ": "m",
    "Έ": "e", "Ά": "a", "Ύ": "y", "Ί": "i", "Ό": "o", "Ή": "i", "Ώ": "o",
    "έ": "e", "ά": "a", "ύ": "y", "ί": "i", "ό": "ο", "ή": "i", "ώ": "o",
    "ϋ": "i", "ϊ": "i", "ΐ": "i", "ΰ": "i",
    "Ϊ": "i", "Ϋ": "i"
}


os.chdir('C:/Users/alift/Desktop/RenameTestFolder')
for f in os.listdir():
    name = f
    new_name = ""
    for l in name:
        if l in char_migrate:
            b = char_migrate[l]
            new_name += b
        else:
            new_name += l
    os.rename(f, new_name)

到目前为止我所尝试的是尝试在 os.rename 内的 new_name 上添加 .encode(encoding="xxx") ,尝试 Unicode、UTF-8 和 Ansi(只有 UTF-8 使我的脚本运行没有错误,但我读到这是 python 使用的默认编码,并且我没有得到任何结果)。

最后,我的问题可能只是我需要批量更改编码,而不是像我那样批量更改名称,但我不知道该怎么做。

有什么建议或见解吗? 感谢您的宝贵时间!

最佳答案

请注意 unicode 中的重音字符可能是一场噩梦,因为它们大多数以两种不同的形式存在:组合形式和分解形式。例如,拉丁文 à 是带有 GRAVE U+00E0 的拉丁文小写字母 A。但它可以是 '\u0061\u0300',拉丁文小写字母 A 后跟组合重音。 unicodedata 模块提供 normalize 函数来转换为任何这些形式。区分它们的唯一方法是转储它们的十六进制代码,但根据 Python 字符串相等运算符,它们并不相等。

因此,当出现问题并且涉及重音字符时:

  1. 转储十六进制代码以更好地了解幕后发生的情况
  2. 使用规范化形式来限制消歧问题

    >>> print hex(ord(normalize('NKFC', '\u0061\u0300')))
    0x6e
    

关于python - 使用 python 重命名文件时出现问题,某些字符拒绝更改。(可能是更改编码时出现问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54806499/

相关文章:

python - 从一个文件执行两个不断重复的脚本

python - Windows命名管道: detect in Python on writer side when reader has closed its end without having to write data

visual-studio - TypeScript 重命名变量

python - TypeError : tuple indices must be integers, 不是 str 使用 pyspark 和 RDD

python - (逻辑索引)对numpy数组中的RGBA值执行公式

ruby - 如何确定Ruby中字符串的编码

c# - 数据库中存储的字符串的编码问题

ruby-on-rails-3 - 耙数据库 :create encoding error with postgresql

c# - 在 C# 中重命名目录

dataframe - 重命名的区别!并在 Julia 中使用新的 DataFrame 重命名?