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

How to set the filename encoding globally for a python interpreter?

在一个项目中,我们需要在源代码中到处打开很多文件。我们知道磁盘上的所有文件名都是以 utf-8 编码的,并且所有文件名在内部都以 Unicode 进行。

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

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

到这个更简单的版本:

open(filename)

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

假设这确实是您的意思(而不是文件 内容 的编码),这样做就可以了:

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)

没有这样的选项,因为 open 函数记录了 对字符串进行 UTF-8 编码的行为。

原因很简单:open 或多或少只是底层 OS 函数的委托,并且必须作用于 OS 函数可以作用的任何字符串和。因此,它需要原始 Python 字符串而不是 unicode。

如果你需要这个,实现一个包装函数来做到这一点。 在 Python 中,您可以只覆盖局部名称——或全局名称,就此而言:

__uni_open = lambda string: __builtins__.open(string.encode("utf-8"))
open = __uni_open

您的所有应用程序在任何模块中工作。

我不建议这样做 -- 它可能会破坏项目无法控制的内容。