使用 python 重命名文件时出现问题,一些字符拒绝更改。(可能是更改编码时出现问题)
Problem renaming files with python, some characters refuse to change.(Problem changing encoding, probably)
我四处搜索,但虽然我看到了一些与我的问题类似的问题,但我没有设法获得足够的信息来解决我的问题...
我的一位同事在 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 使用的默认编码,但我没有得到任何结果。
最后,我的问题可能只是我需要批量更改编码而不是像我那样批量更改名称,但我不知道该怎么做。
有任何提示或见解吗?
感谢您的宝贵时间!
我认为这可能是一件 windows 的事情,因为我 运行 你的脚本在 linux/ python 3 下并且它运行完美。
Input file:
Παλαιά-Πόλη-4-768x156.txt
Output file:
palaia-pοli-4-768x156.txt
当心 unicode 中的重音字符可能是一场噩梦,因为它们中的大多数以 2 种不同的形式存在:组合和分解。例如,拉丁文 à
是拉丁文小写字母 A WITH GRAVE U+00E0。但它可以是 '\u0061\u0300'
,拉丁文小写字母 A 后跟组合重音符号。 unicodedata
模块提供了 normalize
函数来转换为任何这些形式。区分它们的唯一方法是转储它们的十六进制代码,但根据 Python 字符串相等运算符,它们并不相等。
因此,当出现问题并涉及重音字符时:
- 转储十六进制代码以更好地理解引擎盖下发生的事情
使用规范化形式来限制消歧问题
>>> print hex(ord(normalize('NKFC', '\u0061\u0300')))
0x6e
我四处搜索,但虽然我看到了一些与我的问题类似的问题,但我没有设法获得足够的信息来解决我的问题...
我的一位同事在 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 使用的默认编码,但我没有得到任何结果。
最后,我的问题可能只是我需要批量更改编码而不是像我那样批量更改名称,但我不知道该怎么做。
有任何提示或见解吗? 感谢您的宝贵时间!
我认为这可能是一件 windows 的事情,因为我 运行 你的脚本在 linux/ python 3 下并且它运行完美。
Input file:
Παλαιά-Πόλη-4-768x156.txt
Output file:
palaia-pοli-4-768x156.txt
当心 unicode 中的重音字符可能是一场噩梦,因为它们中的大多数以 2 种不同的形式存在:组合和分解。例如,拉丁文 à
是拉丁文小写字母 A WITH GRAVE U+00E0。但它可以是 '\u0061\u0300'
,拉丁文小写字母 A 后跟组合重音符号。 unicodedata
模块提供了 normalize
函数来转换为任何这些形式。区分它们的唯一方法是转储它们的十六进制代码,但根据 Python 字符串相等运算符,它们并不相等。
因此,当出现问题并涉及重音字符时:
- 转储十六进制代码以更好地理解引擎盖下发生的事情
使用规范化形式来限制消歧问题
>>> print hex(ord(normalize('NKFC', '\u0061\u0300'))) 0x6e