2010-06-28 58 views
4

Python 2.6.5據說支持Unicode嗎? listdir()如何不在IDLE中,但Python 3.1.2在IDLE中確實顯示Unicode? (這是Windows 7測試)Python 2.6.5支持Unicode嗎?爲什麼listdir()不會但Python 3.1.2確實顯示Unicode?

下面的代碼是相同的行爲:

for dirname, dirnames, filenames in os.walk('c:\path\somewhere'): 
    for subdirname in dirnames: 
     print (os.path.join(dirname, subdirname)) 
    for filename in filenames: 
     print (os.path.join(dirname, filename)) 

更新: unicode的是文件名,而不是在路...

回答

5

的Unicode字符串的語法從2更改爲3.嘗試指定一個如下所示的Unicode字符串:

u'c:\\path\\somewhere' 

如果您希望Python 3的語法(s特林文字是系統默認的Unicode除非b前綴給出),使用

from __future__ import unicode_literals 

在你的文件的頂部。

+6

的確如此。關鍵是在Python 2中,如果你通過傳入一個Unicode字符串來明確地請求它們,你只會從'listdir()'和相關函數中獲得Unicode路徑名。''os.listdir('。')'給你不同的來自'os.listdir(u'。')'的結果。 – bobince 2010-06-28 11:57:55

+0

有趣...它會顯示「\ u6c34 ...」有沒有一種方法來顯示那些字形而不是數字? – 2010-06-28 12:00:39

+0

「show」是什麼意思?至少'print'函數/語句應該顯示它們沒有轉義字符。否則,請將其作爲新問題發佈,因爲它與'os.walk'無關。 – Philipp 2010-06-28 12:03:16

2

Python 3在默認情況下會將所有字符串設置爲Unicode,這可能是爲什麼它可以與Python 3開箱即用。

在2.3版本改變了listdir狀態

文檔:在Windows NT/2K/XP和Unix,如果路徑是一個Unicode對象,結果將是Unicode對象列表。不可解碼的文件名仍將作爲字符串對象返回。

所以我想你必須在Python 2中明確地給你的路徑作爲一個Unicode字符串來得到Unicode的結果。

0

Python 2.x支持unicode,但unicode不是默認值(因爲它是3.x)。

在Python 2.x中,字符串默認情況下是8位字節數組,因此在使用文件系統時您將看到UTF-8編碼的文件名。

在Python 3.x中,默認情況下所有字符串實際上都是unicode,所以UTF-8解碼發生在IO子例程中。