установить неявное кодирование \ декодирование ошибок по умолчанию в python - PullRequest
1 голос
/ 29 июля 2010

Я работаю с внешними данными, которые закодированы в латинице 1. Итак, я добавил sitecustomize.py и в нем добавил

sys.setdefaultencoding('latin_1') 

Конечно, теперь работа со строками latin1 работает нормально.

Но в случае, если я столкнусь с чем-то, что не закодировано в латинице 1:

s=str(u'abc\u2013')

Я получаю UnicodeEncodeError: 'latin-1' codec can't encode character u'\u2013' in position 3: ordinal not in range(256)

Что бы я хотел, так это то, что некодируемые символы просто игнорировались бы, т.е. я получал бы это в приведенном выше примере s=='abc?', и делал бы это без явного вызова decode() или encode каждый раз, то есть не s. декодировать (..., «заменить») при каждом вызове.

Я пытался делать разные вещи с codecs.register_error, но безрезультатно.

помогите пожалуйста?

Ответы [ 2 ]

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

Существует причина, по которой скрипты не могут вызывать sys.setdefaultencoding.Не делайте этого, некоторые библиотеки (включая стандартные библиотеки, включенные в Python) ожидают, что значением по умолчанию будет 'ascii'.

Вместо этого явно декодируйте строки в Unicode при чтении в вашу программу (через файл, stdin, socketи т. д.) и явно кодируют строки при их записи.

Явное декодирование принимает параметр, определяющий поведение для некодируемых байтов.

0 голосов
/ 27 апреля 2019

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

import codecs
from logging import getLogger

log = getLogger()

def custom_character_handler(exception):
    log.error("%s for %s on %s from position %s to %s. Using '?' in-place of it!",
            exception.reason,
            exception.object[exception.start:exception.end],
            exception.encoding,
            exception.start,
            exception.end )
    return ("?", exception.end)

codecs.register_error("custom_character_handler", custom_character_handler)

print( b'F\xc3\xb8\xc3\xb6\xbbB\xc3\xa5r'.decode('utf8', 'custom_character_handler') )
print( codecs.encode(u"abc\u03c0de", "ascii", "custom_character_handler") )

Запустив его, вы увидите:

invalid start byte for b'\xbb' on utf-8 from position 5 to 6. Using '?' in-place of it!
Føö?Bår
ordinal not in range(128) for π on ascii from position 3 to 4. Using '?' in-place of it!
b'abc?de'

Ссылки:

  1. https://docs.python.org/3/library/codecs.html#codecs.register_error
  2. https://docs.python.org/3/library/exceptions.html#UnicodeError
  3. Как игнорировать недопустимые строки в файле?
  4. У объекта 'str' нет атрибута 'decode'.Ошибка Python 3?
  5. Как заменить недопустимые символы Юникода в строке в Python?
  6. UnicodeDecodeError в Python при чтении файла, какигнорировать ошибку и перейти к следующей строке?
...