【问题标题】:Detecting file name with Unicode characters in windows在 Windows 中检测带有 Unicode 字符的文件名
【发布时间】:2013-11-08 00:07:59
【问题描述】:

Python 版本:2.7.3

文件名:测试雪人字符--☃--.mp3

运行了以下测试,没有一个被证明是成功的。

>>> os.path.exist('test snowman character --☃--.mp3')
False
>>> os.path.exist(repr('test snowman character --☃--.mp3'))
False
>>> os.path.isfile('test snowman character --\\xe2\\x98\\x83--.mp3')
False
>>> os.path.isfile(r'test snowman character --\\xe2\\x98\\x83--.mp3')
False
>>> os.path.isfile('test snowman character --☃--.mp3'.decode('utf-8'))
False

尝试使用 glob 检索文件,即使该测试失败。

目标是检测此文件并将其复制到另一个文件夹, 请指教。

【问题讨论】:

  • os.listdir(u'.') 告诉你什么在当前目录中?
  • 注意:转义 UTF8 字节序列在这里不起作用;但两者都不会使用 UTF8,因为 Windows NTFS 文件系统使用 UTF16。在此处给出 python unicode 路径值;仅当 unicode 雪人真正以 UTF8 格式输入终端时,您的上一个版本才有效。

标签: python windows python-2.7 unicode


【解决方案1】:

使用 unicode 值;最好使用 unicode 转义序列:

os.path.isfile(u'test snowman character --\u2603--.mp3')

当你给它一个 unicode 路径时,Windows 上的 Python 将使用正确的 Windows API 来列出 UTF16 文件。

有关 Python 如何通过 unicode 与字节字符串文件路径改变行为的更多信息,请参阅Python Unicode HOWTO

【讨论】:

    【解决方案2】:

    Windows NTFS 文件系统使用 UTF-16(问Martijn Pieters),试试这个:

    >>> os.path.exists(u'test snowman character --☃--.mp3'.encode("UTF-16"))
    

    但首先要确保解释器的输入编码是正确的。 print repr(u'test snowman character --☃--.mp3') 应该输出:

    u'test snowman character --\u2603--.mp3'
    

    注意:我无法对此进行测试,因为 Windows CMD 不允许我输入雪人符号。无论如何,如果你只给它一个 Unicode 字符串,Python 会做正确的事情,所以编码调用是多余的。总结一下,我推荐Martijn Pieters'的回答。

    【讨论】:

    • 输出将在u之前使用单个反斜杠。
    • @MartijnPieters:我直接从解释器那里复制了它。由于输出表示是“字符串中的字符串”,因此需要对反斜杠进行转义。
    • 对;您在解释器中使用了 just repr()。解释器再次使用repr()。您通常会在解释器中省略明确的repr(),或使用print repr();关键是要获得一个可往返的表示,它看起来像一个可以再次重用的 unicode 文字。这里额外的反斜杠使得该值不可重用,这里的问题和关于何时转义转义的另一个答案之间存在足够的混淆。
    • @MartijnPieters:很公平。已编辑。
    【解决方案3】:

    文字 Unicode 字符串应该以u' 开头,试试os.path.exist(u'test snowman character --☃--.mp3')

    如果您想使用转义序列,则为 ur',如 os.path.isfile(ur'test snowman character --\\xe2\\x98\\x83--.mp3')

    http://docs.python.org/2.7/reference/lexical_analysis.html#strings

    【讨论】:

    • .decode('utf8') 大概已经处理了这种情况。
    • 原始 unicode 字符串保留反斜杠。 UTF8“字节”是按字面意思理解的,而不是作为代码点。在 unicode 字符串中使用 \u2603
    • .decode() 取决于源文档的默认编码是否正确。它通常是 ASCII,但是您的字符串不是 ASCII(至少不是有效的 ASCII)。请参阅:wiki.python.org/moin/DefaultEncodingdocs.python.org/2/howto/unicode.html
    猜你喜欢
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    相关资源
    最近更新 更多