我可以跨平台方式更改默认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)
答案 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
后,我编写并测试了此代码。