【问题标题】:IOError return message with broken encoding编码损坏的 IOError 返回消息
【发布时间】:2018-03-07 11:36:45
【问题描述】:

Python 2.6 Linux (CentOS)

我使用 shutil.copyfile() 函数来复制文件。如果文件不存在,我会在日志文件中写入异常消息。所以,我收到带有错误符号的消息,因为我的文件路径包含俄语字符。例如: 原始文件路径 - “/PNG/401/405/018_/01200Г/osv_1.JPG”(“Г”是俄语符号) 消息中的文件路径 - “/PNG/401/405/018_/01200\xd0\x93/osv_1.JPG” 我尝试使用此代码print(str(error).decode('utf-8')),但它不起作用。但是这段代码 print(os.listdir(r'/PNG/401/405/018_/')[0].decode('utf-8')) 工作得很好。有任何想法吗?

【问题讨论】:

    标签: python encoding exception-handling python-2.6 shutil


    【解决方案1】:

    让我们分解你的命令:

    print(str(error).decode('utf-8'))
    

    首先它会做:

    str(error)
    

    把它变成一个字符串让我们称之为temp_string

    然后它会尝试做:

    temp_string.decode('utf-8)
    

    这将作为字符串对象失败,没有.decode(),因此您将收到如下错误消息:

    builtins.AttributeError: 'str' object has no attribute 'decode'
    

    它永远不会到达print()

    你应该做的是:

    print(error.decode('utf-8'))
    

    或者,您可以使用:

    print(str(error))
    

    【讨论】:

    • 它不起作用,因为 'error' 变量是 'exceptions.IOError' 的对象。 IOError 没有属性“解码”。
    • 打印出来了 - "[Errno 2] 没有这样的文件或目录:'/localELO_SKV/PNG/401/405/018_/01200\xd0\x93/osv_1.JPG'"
    • 请更新您的问题,您在哪里以及如何使用 shutil.copyfile()
    • 我找到了解决方案。感谢您的帮助。
    • 您愿意发布答案吗?这样其他人就可以看到您是如何解决问题的。
    【解决方案2】:

    输出是完全正确的。 'Г' 是 unicode 字符 U+0413(西里尔大写字母 GHE),其 UTF-8 编码是两个字符 '\xd0''\x93'。您只需使用支持 utf8 的文本编辑器(gvim 或 notepad++)读取日志文件,或者如果您必须在 Python 中处理它,请确保将其作为 utf8 编码文件读取。

    【讨论】:

    • 但是如果我通过print(str(error)) 向linux 终端打印错误,我会看到错误的字符。
    【解决方案3】:

    print(str(error).decode('string-escape')) - 为我工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多