有没有办法改变Python的open()默认文本编码?

时间:2014-07-22 20:53:55

标签: python utf-8 character-encoding locale default

我可以跨平台方式更改默认open() io.open() in 2.7文本编码吗?

因此我不需要每次都指定open(...,encoding='utf-8')

  

在文本模式下,如果未指定 encoding ,则使用的编码取决于平台:调用locale.getpreferredencoding(False)以获取当前的语言环境编码。

虽然文档没有指定如何设置首选编码。该函数在locale模块中,所以我需要更改区域设置?是否有任何可靠的跨平台方式来设置UTF-8语言环境?它会影响除默认文本文件编码以外的任何其他内容吗?

或者语言环境更改很危险(可能会破坏某些内容),我应该坚持自定义包装,例如:

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

4 个答案:

答案 0 :(得分:3)

不要更改区域设置或首选编码,因为;

  • 它可能会影响代码的其他部分(或您正在使用的库);和
  • 不清楚您的代码是否依赖open使用特定的编码。

相反,请使用简单的包装器:

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

这还有另外两个好处:

  • 您可以为所有关键字参数指定默认值(如果需要)。
  • 您可以在调用函数时覆盖默认值。

答案 1 :(得分:2)

你可以设置编码...但它确实很hacky

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一般哲学是明确的比隐含更好,这意味着“正确”的解决方案是在打开文件时明确声明你的编码......

答案 2 :(得分:0)

我不会更改locale中的任何内容,因为它可能会在系统的其他部分产生很多副作用。 open是一个系统级函数调用,因此它的设置可以具有除此之外的效果,或者至少使用相同Python安装的其他Python程序。你的包装看起来合适,非常干净和便携,看起来是正确的解决方案。

答案 3 :(得分:0)

如果您确实需要更改默认编码,则可以替换内置的open函数。

original_open = __builtins__.open
def uopen(*args, **kwargs):
    if "b" not in (args[1] if len(args) >= 2 else kwargs.get("mode", "")):
        kwargs.setdefault("encoding", "UTF-8")
    return original_open(*args, **kwargs)
__builtins__.open = uopen

在发现this mails关于替换邮件列表上的print后,我编写并测试了此代码。