【问题标题】:ast.literal_eval somehow throwing UnicodeDecodeErrorast.literal_eval 以某种方式抛出 UnicodeDecodeError
【发布时间】:2014-10-23 16:57:49
【问题描述】:

好吧……

  • Unicode 字符串被编码为 Python 2.x 字符串(实际上是字节序列)
  • Python 2.x 字符串被解码为 Unicode 字符串

Python UnicodeDecodeError - Am I misunderstanding encode?

我有这个 python 2.7 代码

try:
    print '***'
    print type(relationsline)
    relationsline = relationsline.decode("ascii", "ignore")
    print type(relationsline)
    relationsline = relationsline.encode("ascii", "ignore")
    print type(relationsline)
    relations = ast.literal_eval(relationsline)
except ValueError:
    return
except UnicodeDecodeError:
    return

上面代码的最后一行有时会抛出

UnicodeDecodeError: 'ascii' 编解码器无法在位置解码字节 0xfc 341:序数不在范围内(128)

我认为这将 (1) 以具有某种(未知)编码的字符串开头 (2) 将其解码为 un​​icode 类型,表示字符串 unicode 字符集与 ascii 编码同时忽略所有可以'不能用ascii编码 (3) 把unicode类型编码成ascii编码的字符串,忽略所有不能用ascii表示的字符。

这是完整的堆栈跟踪:

Traceback (most recent call last):
  File "outputprocessor.py", line 69, in <module>
    getPersonRelations(lines, fname)
  File "outputprocessor.py", line 41, in getPersonRelations
    relations = ast.literal_eval(relationsline)
  File "/usr/lib/python2.7/ast.py", line 49, in literal_eval
    node_or_string = parse(node_or_string, mode='eval')
  File "/usr/lib/python2.7/ast.py", line 37, in parse
    return compile(source, filename, mode, PyCF_ONLY_AST)
  File "<unknown>", line 1
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xfc in position 341: ordinal not in range(128)
                      ^
SyntaxError: invalid syntax

但这显然在某些地方是错误的。更令人困惑的是 UnicodeDecodeError 没有捕捉到 UnicodeDecodeError。我错过了什么?也许这就是问题所在? http://bugs.python.org/issue22221

【问题讨论】:

  • 您的 ascii 文本不是。严格的 ascii 是一个 7 位字符集(0x00 -> 0x7F),你有一个 > 0x7F 的字符,这意味着它不是 ascii。也许它是扩展 ascii、iso8859-1 或其他。但它不是“ascii”。
  • 如果您能找出一个始终抛出错误的示例,这将更容易调试。建议使用MCVE:一个最小的独立代码示例,运行时会运行并产生您所说的错误。
  • 另外,请向我们展示异常的完整堆栈跟踪。
  • 我想这是一个 ast 语法错误

标签: python unicode encoding


【解决方案1】:

仔细查看堆栈跟踪。它正在抛出一个SyntaxError

您正在尝试literal_eval 字符串"UnicodeDecodeError: 'ascii' codec can't decode byte 0xfc in position 341: ordinal not in range(128)"。您可以根据需要对该字符串进行编码/解码,但 ast 不知道如何处理它 - 这显然不是有效的 Python 文字。

见:

>>> import ast
>>> ast.literal_eval('''UnicodeDecodeError: 'ascii' codec can't decode byte 0xfc in position 341: ordinal not in range(128)''')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/ast.py", line 49, in literal_eval
    node_or_string = parse(node_or_string, mode='eval')
  File "/usr/lib/python2.7/ast.py", line 37, in parse
    return compile(source, filename, mode, PyCF_ONLY_AST)
  File "<unknown>", line 1
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xfc in position 341: ordinal not in range(128)
                      ^
SyntaxError: invalid syntax

我会查看将这些字符串传递给您的函数的任何来源,它正在生成一些虚假输入。

【讨论】:

    【解决方案2】:

    您正试图从传入的字符串中 literal_eval 回溯来自 relationsline = relationsline.encode("ascii", "ignore")

    您需要将您的 literal_eval 检查移至其自己的 try/except 或在原始 try 块中捕获异常或以某种方式过滤输入。

    【讨论】:

    • 嗯?他在代码中的哪个位置将回溯分配给relationsline?这不是异常的工作方式......
    • @roippi,我的意思是从传入的字符串中。
    猜你喜欢
    • 2016-01-24
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2016-07-13
    • 1970-01-01
    • 2016-04-25
    相关资源
    最近更新 更多