在網上看到了一段python檢索檔案的程式,感覺不錯,模仿著寫了一段,但是發現無法檢索帶有中文的檔案夾。查閱了一些資料後,才知道python(我用的2.6)對中文的支援很麻煩。可是皇天不負有心人,經過一系列的摸索,終於完成了對來源程式的改良,現在,它可以檢索任何檔案夾了。
程式如下:
Code:
#coding:utf-8 #Filename:dir.pyimport os class dir(object): def __init__(self): self.count=0 self.space="" self.list=[] def p(self,url): if type(url).__name__!="unicode": url=unicode(url,"utf-8") else: pass files=os.listdir(url) for file in files: myfile=url+"\\"+file print myfile size=os.path.getsize(myfile) if os.path.isfile(myfile): string=self.space+"|____"+file+str(size)+"\n" string=string.encode("utf-8") self.list.append(string) if os.path.isdir(myfile): string=self.space+"|____"+file+"\n" string=string.encode("utf-8") self.list.append(string) self.space=self.space+"|" self.p(myfile) self.space=self.space[:-5] return self.list def writeList(self,url): f=open(url,'w') f.writelines(self.list) print "ok" f.close() if __name__=="__main__": d=dir() d.p("D:\\張東升\\測試案例管理系統") d.writeList("d:/python.txt") |
在使用os.listdir(url)時,傳入的參數如果有中文漢字,就無法正常使用,原因在於,有漢字時,print type(url) ,這時,可以發現,是<type 'str'>,而listdir()需要傳入的參數類型應該是 <type 'unicode'>,所以,在p(self,url)的最開始,先進行一次轉化。轉化時,先判斷傳入的參數是不是<type 'unicode'>,如果不是,才轉化,否則會出錯。
另外f.writelines(self.list)時,list列表中的元素必須是str類型的,但是經過 string=self.space+"|____"+file+str(size)+"\n"後,string的編碼類別型為unicode,原因在於file的編碼類別型是unicode,其他三個會在執行+操作時自動轉換,所以需要在轉化為str類型。
說起來很拗口,因為我也搞不清楚這些個類型之間的關係,但不管怎樣,總算是可以運行了。
from:http://www.testwo.com/space-1824-do-blog-id-3267.html
=============================
其實os.listdir(path),path只接受str和unicode,如果是unicode,則返回unicode的list;如果是str的則返回str的list(這裡面可能會有不同的編碼,這取決於這個path下是否有不同編碼的檔案或目錄名。換句話說就是返回跟檔案名稱一樣的編碼的str。)