【问题标题】:os.walk returns differently encoded non-ascii (unicode) filenames, how to deal with it?os.walk 返回不同编码的非 ascii (unicode) 文件名,如何处理?
【发布时间】:2016-07-05 22:46:11
【问题描述】:

完全相同的代码,在 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

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

【问题讨论】:

  • 这个方法你看过了吗:docs.python.org/2/library/…
  • @JeremyJStarcher 不!我没有!到目前为止!现在一切正常了!而且我可能会在明天的某个时候关闭我的大写锁定!谢谢!!!111

标签: python python-2.7 unicode


【解决方案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() 函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-17
    • 2010-12-11
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2016-01-23
    相关资源
    最近更新 更多