2014-01-05 78 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 –