Обратите внимание, что ошибка связана с кодированием в ASCII, а не с декодированием из cp307. Но вы не просите его где-либо кодировать, так почему же это происходит?
Что ж, на самом деле есть два возможных места, где что-то может пойти не так, и мы не можем знать, в каком из них, без вашей помощи.
Во-первых, если ваш result[2] уже является объектом unicode, вызов decode('cp037') для него сначала попытается encode с sys.getdefaultencoding(), который обычно равен 'ascii', чтобы было что декодировать. Таким образом, вместо того, чтобы получить сообщение об ошибке «Эй, бозо, я уже декодирован», вы получаете сообщение об ошибке кодирования в ASCII. (Это может показаться очень глупым, но это полезно для нескольких кодеков, которые могут декодировать unicode->unicode или unicode->str, таких как ROT13 и quoted-printable.)
Если это ваша проблема, решение состоит в том, чтобы не звонить decode. Вероятно, вы уже расшифровали данные где-то на пути к этому моменту, так что не пытайтесь делать это снова. (Если вы декодировали его неправильно, вам нужно выяснить, где вы его декодировали, и исправить это, чтобы сделать это правильно; повторное декодирование уже не поможет.)
Во-вторых, передача строки Unicode в print автоматически попытается encode использовать (в зависимости от вашей версии Python) либо sys.getdefaultencoding(), либо sys.stdout.encoding. Если Python не смог угадать правильную кодировку для вашей консоли (довольно распространено в Windows) или если вы перенаправляете стандартный вывод вашего скрипта в файл вместо вывода на консоль (это означает, что Python не может угадать правильную кодировку) , вы можете получить 'ascii' даже в sys.stdout.encoding.
Если это ваша проблема, вы должны явно указать правильную кодировку для вашей консоли (если вам повезет, она будет в sys.stdout.encoding) или кодировку, которую вы хотите для текстового файла, на который вы перенаправляете (вероятно, 'utf-8', но это до вам), и явно encode все, что вы print.
Итак, как узнать, какой из них он?
Простой. print type(result[2]) и посмотреть, unicode или str. Или разбейте его на две части: x = result[2].decode('cp037'), а затем print x и посмотрите, какой из двух повышает. Или запустить в отладчике. У вас есть всевозможные варианты отладки, но вы должны что-то делать.
Конечно, также возможно, что, как только вы исправите первое, вы сразу же столкнетесь со вторым. Но теперь вы знаете, как с этим бороться.
Также обратите внимание, что cp037 — это EBCDIC, одна из немногих известных Python кодировок, которая не совместима с ASCII. На самом деле '\xe3' — это EBCDIC для буквы T.
person
abarnert
schedule
11.12.2013
print type(result[2])дает вамbytearray(как вы сказали в комментарии), то проблема не в том, чтоresult[2]уже является Unicode, это просто проблема с распечаткой правильно декодированного результата. - person abarnert   schedule 12.12.2013print repr(result[2])? - person John Y   schedule 13.12.2013