在项目中,我们需要在源代码中的所有位置打开许多文件。我们知道磁盘上的所有文件名都以utf-8编码,所有文件名都在内部以Unicode格式进行。
有没有办法为正在运行的解释器全局设置文件名编码,以便我们更改以下命令:
open(filename.encode('utf-8'))
到这个更简单的版本:
open(filename)
这可以减少开发人员之间的错误和混淆。我们使用python 2.7。
答案 0 :(得分:3)
假设这真的是你的意思(而不是文件的内容的编码),这样就可以了:
open = lambda fname, *a, **kw: __builtins__.open(fname.encode('utf-8'), *a, **kw)
这只会影响包含(或导入)重新定义的模块,因此它相当安全。但是,从长远来看,它可能不那么容易混淆,也可能不那么容易出错,提供一个不同的命令来打开环境中适合这种情况的文件:
def fsopen(fname, *args, **kwargs):
"""(explain when and why you want this)"""
return open(fname.encode('utf-8'), *args, **kwargs)
答案 1 :(得分:1)
没有这样的选项,因为open
函数记录了行为而不是到UTF-8编码字符串。
这有一个简单的原因:open
或多或少只是底层OS函数的委托,并且必须处理OS函数可以使用的任何字符串。因此,它需要原始Python字符串而不是unicode。
如果需要,请执行包装函数来执行此操作。 在Python中,您可以覆盖本地名称 - 或全局名称:
__uni_open = lambda string: __builtins__.open(string.encode("utf-8"))
open = __uni_open
在所有应用程序使用的任何模块中。
我不建议这样做 - 它可能会破坏项目控制之外的东西。