У меня проблема с пониманием ошибки в Python - PullRequest
0 голосов
/ 21 мая 2019

введите описание изображения здесь Я пытаюсь открыть базовый файл file.txt, который находится в том же CWD, что и мой интерпретатор python.

Так я и делаю a=open("file.txt","r")

Затем я хочу отобразить его содержимое (в нем есть только одна тестовая строка, например hello world)

Так что я делаю content=a.read()

Итак, вы знаете, когда яположить a введите, у меня есть это:

a
<_io.TextIOWrapper name='fichier.txt' mode='r' encoding='UTF-8'>

Тогда у меня есть ошибка, я не понимаю.У кого-нибудь есть идеи как это исправить?

Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    contenu=a.read()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc6 in position 15: invalid continuation byte

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Ваш файл, вероятно, не закодирован в UTF-8. Попробуйте:

from chardet import detect

with open("file.txt", "rb") as infile:
    raw = infile.read()

    encoding = detect(raw)['encoding']  
    print(encoding)
0 голосов
/ 21 мая 2019

Ваш файл не закодирован в UTF-8.Кодировка контролируется инструментом, используемым для создания файла.Убедитесь, что вы используете правильную кодировку.

Вот пример:

>>> s = 'Sébastien Chabrol'
>>> s.encode('utf8')             # é in UTF-8 is encoded as bytes C3 A9.
b'S\xc3\xa9bastien Chabrol'
>>> s.encode('cp1252')           # é in cp1252 is encoded as byte E9.
b'S\xe9bastien Chabrol'
>>> s.encode('utf8').decode('1252')  # decoding incorrectly can produce wrong characters...
'Sébastien Chabrol'
>>> s.encode('cp1252').decode('utf8') # or just fail.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 1: invalid continuation byte

Если вы используете Python 3, вы можете указать кодировку при открытии файла:

a = open('file.txt','r',encoding='utf8')

В Python 2 или 3 вы также можете использовать обратно-совместимый синтаксис:

import io
a = io.open('file.txt','r',encoding='utf8')

Если вы не имеете представления о кодировке, вы можете открыть в двоичном режиме, чтобы увидеть необработанное содержимое байта и вхотя бы сделайте предположение:

a = open('file.txt','rb')
print(a.read())

Подробнее о Python и кодировках здесь: https://nedbatchelder.com/text/unipain.html

...