我想以编程方式编辑文件夹名称。在Windows上它可以完美无缺 - 在linux上有点已经 A?A¶A¼
(Äöü)。
unix上的语言环境工作正常 - 使用en_US.UTF-8
当我在与脚本使用的路径相同的路径上创建目录(称为Äöü
)时,它正确显示为Äöü
。当Python生成目录时,它显示为A?A¶A¼
。
Äöü
A?A¶A¼
Aeoeue
我有一组必须更换的字符。
ä : ae
Ä : Ae
ö : oe
Ö : Oe
ü : ue
Ü : Ue
á : a
à : a
Á : A
....
这是我阅读文件的方式:
def __getChars(file):
chars = {}
with open(file) as f:
content = f.readlines()
for c in content:
c = c.split(':')
x = c[0].strip()
try:
y = c[1].strip()
except:
y = ''
chars[x] = y
return chars
这是我替换姓名的方式
def __replace(string):
try:
string = string.encode('utf8')
except:
pass
for char in chars.keys():
key = char
value = chars[key]
string = string.replace(key, value)
return string
这就是我致电__replace()
chars = __getChars(os.path.join(os.getcwd(), 'system', 'replace'))
for path in os.listdir(root):
src = os.path.join(root, path)
if os.path.isdir(src):
dst = os.path.join(root, __replace(repr(path).decode('unicode-escape')))
if src != dst:
os.rename(src, dst)
答案 0 :(得分:1)
问题在于这个黑客:
repr(path).decode('unicode-escape')
您无法确定不同系统上的字节码编码,即使在具有不同系统编码的Windows或不同编译的Python上,例如CygWin或PyWin。唯一可靠的方法是通过使用unicode路径调用listdir
来获取unicode中的文件名列表,例如: os.listdir(u'.')
或os.listdir(root.decode('utf-8')):
。在unicode中执行所有文件系统操作要好得多。
我甚至编写了一个类似的简单程序,可以在Python 2和Python 3中运行,没有任何破解,它可以将树中的所有文件和目录重命名为ASCII。大多数替换只能从字母中删除重音,可以通过
完成from unicodedata import normalize
out_str = normalize('NFKD', in_str).encode('ascii', 'ignore').decode('ascii')