Python论坛  - 讨论区

标题:我按照书上的代码打印G盘下的目录和文件名,但是为什么只有文件夹的中文名才能正常显示呢?

2011年05月20日 星期五 14:03

代码如下:

# _*_ coding: utf-8 _*_
import os
for root, dirs, files in os.walk("G:\\IE_Download"):
    print root,dirs,files

输出部分节选如下:


G:\IE_Download\这里人气高只能发这儿来了,一个困扰很久的网络问题 - Windows7 32bit

 讨论专区 远景论坛.files\style2098.files [] ['468x60.gif']

#以上是保存的在线网页,文件夹中的名字可以正常显示为中文

G:\IE_Download ['Atheros_AR813X_drv1.0.0.49WHQL', 'FilemonNt7.04', 'L2WinSetup_v2.6.7.17_WHQL', 'SHIYAN\xca\xb5\xd1\xe9SHIYAN', 'VC6_0\xd6\xd0\xd3\xd1\xd4\xaa\xba\xaf\xca\xfd\xce\xde\xb7\xa8\xb7\xc3\xce\xca\xc0\xe0\xcb\xbd\xd3\xd0\xb3\xc9\xd4\xb1\xb5\xc4\xbd\xe2\xbe\xf6\xb0\xec\xb7\xa8

#以上文件中的中文字符却不能够正确显示

 

我尝试过换一种字符编码,但是都是效果相同的,而且在网页中显示这个脚本,直接连文件夹中的中文名字也无法显示了。

请问各位,这是为什么?该如何解决?

2011年05月20日 星期五 14:06

我看的书就是哲思社区写的《可爱的Python》

2011年05月20日 星期五 16:13

# -*- coding: utf-8 -*- 

是横线,好像你的是下划线...

 

汉字输出,有时候比较麻烦,要gb2312和utf-8来回转,你可以多看看这方面的例子

2011年05月20日 星期五 16:42

你可以去看下python2.x的源码,

当你print字符串的时候,调用的是stirngobject.c中的 string_print函数,并且其中的flag被设置成Py_PRINT_RAW,这样将直接调用fwrite函数输出,这就有点像你在vc中用printf("中文");可以正确在控制台输出一样。

 

而当你print一个列表的时候,调用的是listobject.c中的list_print函数,这个函数取出list中的所有元素,并调用object.c中的PyObject_Print来打印他们,但list_print函数传递给PyObject_Print的flags为NULL, 而PyObject_Print在打印字符串的时候依然会调用字符串的 string_print函数,并将空的flags传给string_print,而这时,string_print的flags不再是Py_PRINT_RAW,所以不在向打印字符串本身那样,直接输出,

而是对其中的每个字符都进行适当转义上述看到的\x之类的,就是通过else if (c < ' ' || c >= 0x7f)
            fprintf(fp, "\\x%02x", c & 0xff);这类的语句转义的。

这个功能类似python repr一个字符串

 

所以当你想print,list来直接输出中文是很困难的,即使你保证了网页的编码和python输出的文件编码一样,因为转义过的形似\xd0\xd3只有python知道是什么。

 

你可以把list里的每个字符串提取出来,再直接print

 

for root, dirs, files in os.walk("G:\\IE_Download"):
    for pd in dirs:
        print pd
    
    for pf in files:
        print files
        
    .....

 

 

python3的列表输出就没这问题。。

 

2011年05月20日 星期五 17:03

回二楼:

短横线和下划线都一样。。没区别。。

而且为什么文件夹的中文可以正确显示呢?

我已经再次试验,短横线和下划线按照三楼的方法都可以正确输出。而且我把-*-去掉都可以,似乎只要注释里面有coding关键词就可以

2011年05月20日 星期五 17:12

回三楼:

你说的一大串我没看懂。。也许是我现在懂得还不多,顺便问一句,python是用C开发的?你的留言我珍藏了,我按照你的方法,for zk in dirs: print zk

可以正常输出中文文件名了。

谢谢各位的热心关注和指点:)以下是混输结果:

ha_regmon20e.exe
L2WinSetup_v2.6.7.17_WHQL.rar
new_holytelecom2.07.2各校通用版.rar
ppstreamsetup.exe
qm8chs.exe
sniffer.zip
sogou_pinyin_52.exe
Thunder7.1.6.2194.exe
VC6_0中友元函数无法访问类私有成员的解决办法-------VC6_0的bug - - C++博客.htm

2011年05月20日 星期五 17:29

嗯,python是用C开发的

2011年05月20日 星期五 21:06

加一句判断类型的就行了          

if isinstance(a, unicode): 

            print a.encode('gb2312') 

        else: 

            print a.decode('utf-8').encode('gb2312')

 

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号