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

标签 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', ... ]

顺便说一句,实际文件名是 filename-with-unìčøđe-chars.txt

是什么导致了这种行为,我们该如何避免?

最佳答案

此行为是由 OS X 和 Cent OS 上文件名的不同 unicode 规范化形式引起的。

Technical Report #15 unicode.org 的定义了可用的形式,但 Apple 使用 HFS+ 的轻微变体,如记录 here .

因此,在一种情况下,您在 OS X/HFS+ 上有 NFD,在另一种情况下,您在 Linux 上有 NFC(如果您的文件系统编码是为 Linux 定义的,这并不总是例,请参阅 Wheeler 以了解您可能会发现的许多问题)。

因此,从根本上说,您无法避免这种行为,它的 native 文件系统可以做到这一点。

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

关于python - os.walk 返回不同编码的非 ascii (unicode) 文件名,如何处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36096934/

相关文章:

python - 使用 Python 将一行与多个正则表达式匹配

python - Tkinter 文本小部件。取消选择文本

python - 列表中的随机元素

python - pypfop 0.2.0 和环境变量 FOP_CMD

python - 读取带有希腊文件名的文件

python正则表达式与unicode匹配城市名称

python - 在 pandas 数据框中查找包含 inf 的单元格的行位置和列名

python - 混合属性的过滤器计算结果为 "where false"

python - Facebook Graph API - 获得所有 friend 的喜欢

c++ - Windows下是宽字符还是UTF-8?