Есть ли способ изменить кодировку текста по умолчанию open() Python?

могу ли я изменить значение по умолчанию open() (io.open() в 2.7) кодирование текста кросс-платформенным способом?

так что мне не нужно каждый раз указывать open(...,encoding='utf-8').

в текстовом режиме, если кодирование не указано используемая кодировка зависит от платформы:locale.getpreferredencoding(False) вызывается для получения текущей кодировки локали.

хотя в документации не указано как set кодировка. Функция находится в locale module, поэтому мне нужно изменить локаль? Есть ли надежный кросс-платформенный способ установить локаль UTF-8? Повлияет ли это на что-либо еще, кроме кодировки текстового файла по умолчанию?

или изменения локали опасны (могут что-то сломать), и я должен придерживаться пользовательской оболочки, такой как:

def uopen(*args, **kwargs):
    return open(*args, encoding='UTF-8', **kwargs)

3 ответов


не изменяйте локаль или предпочтительную кодировку, потому что;

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

вместо этого используйте простую оболочку:

from functools import partial
open_utf8 = partial(open, encoding='UTF-8')

это имеет два преимущества:

  • вы можете указать значения по умолчанию для всех аргументов ключевых слов (Если вам нужно).
  • вы можно переопределить значения по умолчанию при вызове функции.

вы можете установить кодировку ... но его действительно суховато

import sys
sys.getdefaultencoding() #should print your default encoding
sys.setdefaultencoding("utf8") #error ... no setdefaultencoding ... but...
reload(sys)
sys.setdefaultencoding("utf8")  #now it succeeds ...

Я бы вместо этого сделать

main_script.py

import __builtin__
old_open = open
def uopen(*args, **kwargs):
    return open(*args, encoding='UTF-8', **kwargs)
__builtin__.open = uopen

затем в любом месте вы называете open он будет использовать кодировку utf8 ... однако это может дать вам ошибки, если вы явно добавляете кодировку

или просто явно передать кодировку в любое время, когда вы открываете файл, или использовать обертку ...

pythons общая философия явная лучше, чем неявная, это означает, что" правильным " решением является явное объявление вашей кодировки при открытии файла ...


Я бы ничего не изменил в locale, Так как он может иметь много побочных эффектов в других частях вашей системы. open - это вызов функции системного уровня, поэтому его настройки могут иметь эффекты за пределами этого или, как минимум, других программ Python, которые используют ту же установку Python. Ваша обертка выглядит подходящей, очень чистой и портативной и выглядит правильным решением.