2010-06-28 32 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子例程中。