2014-08-29 3 views
2

ОК так ...ast.literal_eval как-то метания UnicodeDecodeError

  • строка 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' codec can't decode byte 0xfc in position 341: ordinal not in range(128)

Я думаю, что это (1) начать со строкой с некоторым (неизвестным) шифровальных (2) декодировать его в тип юникода, представляющая строку символов, набор символов Юникода с кодировками 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

+0

ваш текст ascii - нет. Строгий ascii - это 7-битная кодировка (0x00 -> 0x7F), и у вас есть char> 0x7F, что означает, что это не ascii. возможно, это расширенный ascii, iso8859-1 или что-то еще. но это не «ascii». –

+0

Это будет легче отладить, если вы сможете найти пример, который последовательно выдает ошибку. Рекомендуется использовать [MCVE] (http://stackoverflow.com/help/mcve): минимальный, отдельный образец кода, который запускается и создает ошибку, о которой вы говорите при ее запуске. – user2357112

+0

Также, пожалуйста, покажите нам полную трассировку стека исключения. – user2357112

ответ

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 

Я хотел бы посмотреть на то, что источник проходит эти строки в вашу функцию, это создать некоторый фиктивный вход.

0

Вы пытаетесь сделать literal_eval след от relationsline = relationsline.encode("ascii", "ignore") от прошедшего в строке.

Вам нужно будет переместить literal_eval в свой собственный try/except или поймать исключение в исходном блоке try или отфильтровать вход как-то.

+0

А? Где в его коде он присваивает трассировку 'relationshipline'? Это не то, как работают исключения ... – roippi

+0

@roippi, я имел в виду от строки, прошедшей в. –