2016-03-12 70 views
2

我正在使用os.walk遍歷文件夾。那裏有一些非ascii命名文件。對於這些文件,os.walk給了我類似???.txt的東西。我不能用這樣的文件名稱調用open。它抱怨[Errno 22] invalid mode ('rb') or filename。我應該如何解決這個問題?與os.walk非ASCII文件名問題

我使用的是Windows 7,Python 2.7.11。我的系統區域設置是en-us。

+3

使用unicode路徑作爲輸入;所以不是'os.walk(r'C:\ Foo \ bar \ blah')'使用'os.walk(ur'C:\ Foo \ bar \ blah')''。您將獲得所有部件的「unicode」值。 –

回答

8

在Windows上使用字符串路徑列出目錄會生成編碼到系統語言環境的目錄條目。如果系統區域設置無法實際表示這些字符,則此編碼(由Windows完成)可能會失敗,從而導致佔位符字符。但是,底層文件系統可以處理完整的unicode範圍。

解決方法是使用unicode路徑作爲輸入;所以而不是os.walk(r'C:\Foo\bar\blah')使用os.walk(ur'C:\Foo\bar\blah')。然後,您將獲得所有部分的unicode值,而Python使用不同的API與Windows文件系統進行交談,避免編碼步驟中斷文件名。

+0

因此,底層文件系統在unicode中處理路徑,但Windows會在基於系統區域設置的文件系統之上添加另一個級別的編碼。如果是這樣,爲什麼我仍然能夠在系統區域設置爲en-us時在Windows資源管理器GUI中正確地看到非ASCII字符路徑?我的意思是,我可以在GUI中正確「看到」路徑,但是我的代碼無法正常工作。 – smwikipedia

+1

@smwikipedia:在Windows上,有兩個API,一個生成區域編碼數據,另一個生成其他UTF-16(Unicode)數據。 Windows資源管理器使用後者,Python在給定字符串路徑時使用一個,另一個使用「unicode」路徑。 –

+1

@smwikipedia:Python 3只使用Unicode API,方便地避免了Python 2的錯誤[如'os.path.expanduser()'不支持unicode](http://bugs.python.org/issue13207)。 –