好的......
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
答案 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
或在原始试用版块中捕获异常或以某种方式过滤输入。