如何更改Python的文件系统编码(由sys.getfilesystemencoding()
返回)?
我的目标是在输入Unicode路径时使os.listdir
返回Unicode名称,但这仅在文件系统编码也是Unicode时才有效。
此文件系统编码用于编码os.listdir(unicodestring)
输出,默认情况下(如果未指定LC_*
env vars)则为ASCII。
我试图通过LC_ALL
,os.putenv
,os.environ
注入locale.setlocale
无效;文件系统编码不会改变。之后重新加载os
和sys
模块也无济于事。
指定了LC_ALL的示例:
$ env -i LC_ALL=en_US.UTF-8 python -c "import os; print os.listdir(u'.');"
[u'\u0435\u0449\u0433\u0441\u0440']
空的环境示例:
$ env -i python -c "import os; print os.listdir(u'.');"
['\xd0\xb5\xd1\x89\xd0\xb3\xd1\x81\xd1\x80']
一个可能的解决方案是在包装器启动脚本中包含环境变量,但我更喜欢从Python内部开始。
答案 0 :(得分:1)
如果您不相信通过LC_ALL
变量正确配置了操作系统,那么您可以自己进行编码/解码:
import os
def listdir(dirpath):
if isinstance(dirpath,unicode):
dirpath = dirpath.encode('utf8')
return [p.decode('utf8') for p in os.listdir(dirpath)]