2017-02-22 38 views
1

Я получил эту ошибку:Python 0xff байт

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position: 0, invalid start byte 

Я нашел это решение:

>>> b"abcde".decode("utf-8") 

здесь: Convert bytes to a Python string

Но как вы его используете, если а) вы не Не знаете, где находится 0xff, и/или b) вам нужно декодировать файловый объект? Каков правильный синтаксис/формат?

Я разбираюсь в каталоге, поэтому я попытался просмотреть файлы по одному. (Примечание: Это не будет работать, когда проект становится больше !!!)

>>> i = "b'0xff'" 
>>> with open('firstfile') as f: 
...  g=f.readlines() 
... 
>>> i in g 
False 
>>> 0xff in g 
False 
>>> '0xff' in g 
False 
>>> b'0xff' in g 
False 

>>> with open('secondfile') as f: 
<snip - same process> 

>>> with open('thirdfile') as f: 
...  g = f.readlines() 
... 
Traceback (most recent call last): 
File "<stdin>", line 2, in <module> 
File "/usr/local/lib/python3.4/codecs.py", line 313, in decode 
(result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte 

Так что, если это правильный файл, и если я не могу открыть его с помощью Python (я положил его в возвышенный текст, ничего не нашел), как мне декодировать или кодировать это? Спасибо.

ответ

1

У вас есть целый ряд проблем:

  • i = "b'0xff'" Создает строку из 7 байт, а не один байт 0xFF. i = b'\xff' или i = bytes([0xff]) - правильный метод.

  • open по умолчанию декодирует файлы, используя кодировку, возвращаемую local.getpreferredencoding(False). Открыть в двоичном режиме, чтобы получить необработанные необработанные байты: open('firstfile','rb').

  • g=f.readlines() возвращает список строк. i in g проверяет точное соответствие содержания i в содержании строки в списке строк.

  • Используйте значащие имена переменных!

Вместо:

byte = b'\xff' 
with open('firstfile','rb') as f: 
    file_content = f.read() 
if byte in file_content: 
    ... 

Чтобы расшифровать файл, вы должны знать, что это правильно кодирования и обеспечить его при открытии файла:

with open('firstfile',encoding='utf8') as f: 
    file_content = f.read() 

Если вы не знаете, кодирование, сторонний модуль chardet может помочь вам угадать.

+0

Я бы дал 1+ для chadet. Это сообщение http://stackoverflow.com/questions/1461907/html-encoding-issues-%C3%82-character-showing-up-instead-of-nbsp было также очень полезно. –

0

Самый простой способ - использовать try/catch, чтобы поймать UnicodeDecodeError, тогда вы знаете, что это файл, в котором у вас есть ошибка.

Скорее всего, файл не был закодирован в UTF-8. В этом случае вы можете прочитать файл в качестве либо двоичная:

with open('thirdfile', 'rb') as f: 
    g = f.readlines() 

Как выяснить кодировку файла другая проблема.

Смежные вопросы