Могу ли я сделать decode (errors = "ignore") по умолчанию для всех строк в программе на Python 2.7? - PullRequest
8 голосов
/ 02 марта 2012

У меня есть программа на Python 2.7, которая записывает данные из различных внешних приложений. Меня постоянно кусают исключения, когда я пишу в файл, пока не добавлю .decode(errors="ignore") к записываемой строке. (FWIW, открытие файла как mode="wb" не исправляет это.)

Есть ли способ сказать "игнорировать ошибки кодирования для всех строк в этой области"?

Ответы [ 3 ]

12 голосов
/ 02 марта 2012

Вы не можете переопределить методы для встроенных типов и не можете изменить значение по умолчанию для параметра errors на str.decode().Однако есть и другие способы достижения желаемого поведения.

Немного более приятный способ: Определите свою собственную decode() функцию:

def decode(s, encoding="ascii", errors="ignore"):
    return s.decode(encoding=encoding, errors=errors)

Теперь вы будетенужно позвонить decode(s) вместо s.decode(), но это не так уж плохо, не так ли?

Хак: Вы не можете изменить значение по умолчанию errors параметр, но вы можете перезаписать то, что делает обработчик по умолчанию errors="strict":

import codecs
def strict_handler(exception):
    return u"", exception.end
codecs.register_error("strict", strict_handler)

Это существенно изменит поведение errors="strict" на стандартное "ignore" поведение,Обратите внимание, что это будет глобальное изменение, затрагивающее все импортируемые вами модули.

Я не рекомендую ни один из этих двух способов.Настоящее решение состоит в том, чтобы получить правильное кодирование.(Я хорошо знаю, что это не всегда возможно.)

3 голосов
/ 22 марта 2017

Как уже упоминалось в моей теме по вопросу взлом с Свен Марнах даже возможен без новой функции:

import codecs
codecs.register_error("strict", codecs.ignore_errors)
2 голосов
/ 02 марта 2012

Я не уверен, что именно вы настроили, но вы можете получить класс из str и переопределить его метод декодирования:

class easystr(str):
    def decode(self):
        return str.decode(self, errors="ignore")

Если вы затем преобразуете все входящие строки в easystrошибки будут игнорироваться:

line = easystr(input.readline())

При этом декодирование строка преобразует ее в Unicode, что никогда не должно приводить к потерям.Не могли бы вы выяснить, какую кодировку используют ваши строки, и указать это в качестве аргумента encoding для decode?Это было бы лучшим решением (и вы все равно можете сделать его по умолчанию описанным выше способом).

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

import codecs
input = codecs.open(filename, "r", encoding="latin-1") # or whatever
...