При сохранении набора данных Pandas в Excel я столкнулся с

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe6 in position 0: invalid continuation byte

Некоторое копание показало, что я могу собрать 3 символа ascii, и получающаяся строка, кажется, начинается с байта продолжения UTF-8. Очевидно, что в строке нет многобайтовых символов. Как лучше всего преодолеть это, чтобы все мои данные интерпретировались как символы ASCII?

Вот код Python, который демонстрирует, как проявляется продолжение байта

Python 3.7.1 (default, Dec 14 2018, 13:28:58)
[Clang 4.0.1 (tags/RELEASE_401/final)] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> string_from_3_ascii_chars = chr(50) + chr(51) + chr(48)
>>> print(string_from_3_ascii_chars)
230
>>> print(string_from_3_ascii_chars.startswith(str(0xe6)))
True
>>>
0
Oleg Zhylin 17 Авг 2019 в 01:09

2 ответа

Лучший ответ

В рассматриваемом примере str(0xe6) принимает целое число 0xe6 (230 в десятичной записи) и вызывает repr(object) для него. Это создает строку '230'. string_from_3_ascii_chars начинается с '230'. startswith подтверждает это, возвращая True.

0
Oleg Zhylin 20 Авг 2019 в 13:12

Это возможно, отсоединив энкодер и заменив его на свой энкодер.

  • создайте файл примера в кодировке Latin-1 / ascii.
  • открыть файл с кодировкой utf-8
  • отсоединить кодировку и заменить на «Latin-1 / ascii»
  • читать файл

Примечание. Этот метод изменяет права доступа к файлу. Таким образом, вы сможете читать, но не записывать в файл.

with open("/Desktop/temp/junk1",'wb') as f: 
    s="Hello Jalapeño".encode("latin-1") 
    f.write(s)
with open("/Desktop/temp/junk1",'r') as f: 
    b=f.detach()
    f=io.TextIOWrapper(b,"latin-1") 
    print(f.read())

`

0
tripleee 15 Сен 2019 в 08:37