os.walk返回不同编码的非ascii(unicode)文件名,如何处理它?

时间:2016-03-19 01:51:04

标签: python python-2.7 unicode

完全相同的代码,在Mac OsX和CentOS 7上运行会返回不同的结果:

>>> path = u'examples'
>>> import os
>>> walker = os.walk(path, followlinks=True)
>>> list(walker)

在CentOS上:

[u'filename-with-un\xec\u010d\xf8\u0111e-chars.txt', ... ]

在MacOSX上:

[u'filename-with-uni\u0300c\u030c\xf8\u0111e-chars.txt', ... ]

BTW,实际文件名为filename-with-unìčøđe-chars.txt

导致此行为的原因是什么,我们如何避免这种行为?

1 个答案:

答案 0 :(得分:1)

该行为是由OS X和Cent OS上的文件名的不同unicode规范化表单引起的。

unicode.org的Technical Report #15定义了可用的表单,但Apple对HFS +使用了一个略有变体的文档here

因此,在一个案例中,你在OS X / HFS +上有NFD,而在另一个案例中你有适用于Linux的NFC(如果你很高兴你的文件系统编码完全是为Linux定义的,那并不总是如果您遇到很多问题,请参阅Wheeler

所以,从根本上说,你无法避免这种行为,它的本机文件系统就是这样做的。

但如果你提出不同的答案,你可能会得到一个更令人满意的答案。您可以通过标准化到常规规范化形式等以有意义的方式比较名称,具体取决于您需要比较它们的原因。 Python使用unicodedata函数在normalize()模块中提供规范化函数。