2014-01-05 48 views
0

如何更改Python的文件系统编码(由sys.getfilesystemencoding()返回)? 我的目标是在输入Unicode路径时使os.listdir返回Unicode名称,但这只有在文件系统编码也是Unicode时才有效。更改Python文件系统编码

该文件系统编码用于编码os.listdir(unicodestring)输出,默认情况下(如果没有指定LC_*环境变量)它是ASCII。

我试图通过os.putenv注入LC_ALLos.environlocale.setlocale无济于事;文件系统编码不会改变。之后重新加载ossys模块也无济于事。

实施例与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

文件系统编码由操作系统设置... – MattDMo

+1

@MattDMo在现代Linux上,假设它是UTF8是安全的。重点是没有环境变量,Python无法确定实际的文件系统编码,并且默认为ASCII。 –

回答

1

如果你不相信,OS通过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)] 
+0

谢谢。我以类似的方式结束了修补os.listdir –