如何通过Python更改文件系统编码?

11
>>> import sys
>>> sys.getfilesystemencoding()
'UTF-8'

我如何更改那个?我知道如何更改默认系统编码。

>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding('ascii')

但是没有sys.setfilesystemencoding


请注意,在早期的Python 3.x版本中有sys.setfilesystemencoding函数和环境变量PYTHONFSENCODING。它们存在问题并已被删除,现在Python使用区域设置编码作为文件系统编码。请参阅Victor Stinner博客中的Painful History of the Filesystem Encoding - wim
2个回答

15

有两种方法可以更改它:

  1. (仅适用于Linux) 在启动Python之前使用 export LC_CTYPE=en_US.UTF-8 :
  1. (仅适用于Linux) 在启动Python之前使用 export LC_CTYPE=en_US.UTF-8
$ LC_CTYPE=C python -c 'import sys; print(sys.getfilesystemencoding())'
ANSI_X3.4-1968
$ LC_CTYPE=en_US.UTF-8 python -c 'import sys; print(sys.getfilesystemencoding())'
UTF-8

请注意,如果未设置LC_CTYPE,则LANG会作为其默认值,而LC_ALL将覆盖LC_CTYPE和LANG的值。

  1. 猴子补丁:
import sys
sys.getfilesystemencoding = lambda: 'UTF-8'

两种方法都可以让像os.stat这样的函数接受Unicode(Python2.x)字符串。否则,当这些函数在文件名中看到非ASCII符号时,它们会引发异常。

更新:在(1)变量中,语言环境必须可用(出现在locale -a中),以便此设置能够产生预期效果。


@sureshvv 你的操作系统是什么? - Antony Hatchkins
@sureshvv 在这种情况下重新启动确实有些过度,但我很高兴你已经解决了问题。你是直接从命令行启动 Python 还是作为系统服务启动的? - Antony Hatchkins
@sureshvv 关于 /etc/environment 的事情并不令人意外,但是 export LANG=en_US.UTF8 立即生效。 - Antony Hatchkins
@sureshvv 负责 getfilesystemencoding 的特定环境变量是 LC_CTYPE。如果未设置它,则使用 LANG 作为默认值。最后,如果设置了 LC_ALL,则会覆盖 LC_CTYPE 和 LANG 两者。 - Antony Hatchkins
@sureshvv 请参考这个答案 - Antony Hatchkins
显示剩余11条评论

3
文件系统编码通常是操作系统的固有属性。它无法更改——如果出于某种原因,您需要创建名称编码与文件系统编码不同的文件,请勿使用Unicode字符串作为文件名。(或者,如果您使用Python 3,则使用字节对象而不是字符串。)
详细信息请参见文档。特别要注意的是,在Windows系统上,文件系统是本地Unicode,因此实际上没有进行任何转换,因此无法使用替代文件系统编码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接