UnicodeDecodeError при обработке ударных слов - PullRequest
0 голосов
/ 06 июня 2018

У меня есть скрипт на python, который читает файл YAML (работает во встроенной системе).Без акцентов скрипт работает нормально на моей машине разработки и во встроенной системе.Но с акцентированными словами заставьте его завершиться с

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 6: ordinal not in range(128)

только во встроенной среде.

Пример YAML:

data: ã

Фрагмент, который читает YAML:

with open(YAML_FILE, 'r') as stream:
  try:
    data = yaml.load(stream)

Попробовал кучу решений безуспешно.

Версии: Python 3.6, PyYAML 3.12

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Вы можете указать кодек, который должен использоваться при выгрузке данных с использованием PyYAML, но вы не можете указать свой код в PyYAML при загрузке.Однако PyYAML будет обрабатывать Unicode в качестве входных данных, и вы можете явно указать, какой кодек использовать при открытии файла для чтения, этот кодек затем используется для возврата текста (вы открываете файл как текстовый файл с 'r', который используется по умолчанию дляopen()).

import yaml

YAML_FILE = 'input.yaml'

with open(YAML_FILE, encoding='utf-8') as stream:
    data = yaml.safe_load(stream)

Обратите внимание, что вам почти никогда не придется использовать yaml.load(), , который задокументирован как небезопасный , вместо этого используйте yaml.safe_load().

Для сбросаdata в том же формате, в котором вы его загрузили, используйте:

import sys
yaml.safe_dump(data, sys.stdout, allow_unicode=True, encoding='utf-8',
               default_flow_style=False)

default_flow_style необходим для того, чтобы не получать фигурные скобки в стиле потока, а allow_unicode необходим, иначе вы получитеdata: "\xE3" (т.е. escape-последовательности для символов Юникода)

0 голосов
/ 06 июня 2018

Кодек, который читает ваши байты, был установлен в ASCII.Это ограничивает вас байтовыми значениями от 0 до 127.

Представление акцентированных символов в Unicode выходит за пределы этого диапазона, поэтому вы получаете ошибку декодирования.

Кодек UTF-8декодирует ASCII так же, как и UTF-8, потому что ASCII является (очень маленьким) подмножеством UTF-8, по замыслу.

Если вы можете изменить свой кодек на декодирование UTF-8, он должен работать.

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

...