ast.literal_eval以某种方式抛出UnicodeDecodeError

时间:2014-08-29 16:27:16

标签: python unicode encoding

好的......

  • 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)将其解码为unicode类型,表示带有ascii编码的unicode字符集的字符串,同时忽略所有可以& #c;用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

2 个答案:

答案 0 :(得分: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

我会查看将这些字符串传递给您的函数的源代码,它会产生一些虚假的输入。

答案 1 :(得分:0)

您正尝试literal_eval来自传入字符串的relationsline = relationsline.encode("ascii", "ignore")的追溯。

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