Обработка Python UTF-8 - PullRequest
       32

Обработка Python UTF-8

0 голосов
/ 20 июля 2010

Я использую Python 2.6.1 и у меня проблема с utf-8 в моем коде.Эта проблема воспроизводится с помощью этого кода:

# -*- coding: utf-8 -*-
import os, sys
import string, time
import codecs, re
bDATA='"Domenick Lombardozzi","Eddie Marsan","Isaach De Bankolé","John Hawkes"'
print (bDATA)
fileObj = codecs.open("btvresp1.txt", "r", "utf-8")
data = fileObj.read()
print (data)

Первый отпечаток bDATA работает просто отлично.Однако, если те же данные находятся в файле btcresp1.txt, python жалуется следующим образом:

cat btvresp2.txt
"Domenick Lombardozzi","Eddie Marsan","Isaach De Bankol?","John Hawkes"

python
Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> # -*- coding: utf-8 -*-
... 
>>> import os, sys
>>> import string, time
>>> import codecs, re
>>> bDATA='"Domenick Lombardozzi","Eddie Marsan","Isaach De Bankol","John Hawkes"'
>>> print (bDATA)
"Domenick Lombardozzi","Eddie Marsan","Isaach De Bankol","John Hawkes"
>>> fileObj = codecs.open("btvresp2.txt", "r", "utf-8")
>>> data = fileObj.read()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/codecs.py", line 666, in read
    return self.reader.read(size)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/codecs.py", line 472, in read
    newchars, decodedbytes = self.decode(data, self.errors)
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 55-57: invalid data

Я не уверен, почему одни и те же данные при чтении из файла вызывают проблемы.Может кто-то пролить свет на то, почему это поведение и как я могу решить эту проблему?

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 20 июля 2010

Похоже, что содержимое вашего файла не закодировано в UTF-8. Вы уверены, что не сохранили его в другой кодировке? Когда вы cat файл, терминал отображает ? вместо é, что также намекает на проблему кодирования в файле, так как ваш терминал, похоже, использует UTF-8.

Также у вас есть два файла, btvresp1.txt и btvresp2.txt. Вы используете правильный?

1 голос
/ 20 июля 2010

codecs.open возвращает объект, метод которого read возвращает строку unicode , not закодированную строку байтов - вот и весь смысл функции codecs.open.Таким образом, ваш print (data), если и когда вы доберетесь до него, будет полностью, кардинально отличаться от вашего рабочего print (bDATA): последний печатает байтовые строки в кодировке utf-8, последний будет пытаться напечатать объекты в кодировке Unicode (чтоможет работать, а может и не работать, в зависимости от вашей среды, но с Terminal.app у вас должно быть все в порядке, чтобы использовать кодировку utf-8).

Однако ваши проблемы возникают гораздо раньше: файл, созданный кодекамиПодобный объект утверждает, что байты с 55 по 57 не являются допустимой кодировкой utf-8.Способ проверить это что-то вроде ...:

>>> f = open("btvresp2.txt", "rb")
>>> print repr(f.read()[50:65])

, где я также показываю несколько байтов до и после, для контекста.Если вы сделаете это и отредактируете свой вопрос, чтобы показать нам результаты, мы могли бы догадаться, в какой кодировке находится ваш файл (единственная уверенность на данный момент в том, что это , а не в utf-8).кодирование).

...