如何为python解释器全局设置文件名编码?

时间:2015-06-01 15:38:17

标签: python encoding utf-8 filenames

在项目中,我们需要在源代码中的所有位置打开许多文件。我们知道磁盘上的所有文件名都以utf-8编码,所有文件名都在内部以Unicode格式进行。

有没有办法为正在运行的解释器全局设置文件名编码,以便我们更改以下命令:

open(filename.encode('utf-8'))

到这个更简单的版本:

open(filename)

这可以减少开发人员之间的错误和混淆。我们使用python 2.7。

2 个答案:

答案 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

在所有应用程序使用的任何模块中。

我不建议这样做 - 它可能会破坏项目控制之外的东西。