最近想寫一個python腳本實現對文件夾中的文件進行批量命名。每個文件對應從txt文檔中提取出來的一行,因為文件名是中文,所以涉及到了一些中文編碼的問題。
腳本運行環境是win10+python27
首先,從txt中提取出中文字符編碼格式和window系統里面中文文件名的編碼格式是不同的。所以在提取之后需要將字符先解碼成unicode再編碼成對應的格式,然后對文件進行重命名。
很明確的一點是win10系統中中文文件名的編碼格式是gbk,但是不是很懂txt里中文字符的編碼到底是什么格式。在txt文檔的另存為界面看到的編碼方式是ANSI碼,ANSI是擴展的ASCII編碼,在簡體中文Windows操作系統中,ANSI 編碼代表 GBK 編碼。但在python代碼里面是用gb2312對它做的解碼,解碼也成功。
查資料顯示gbk是gb2312的一個拓展版本,gb2312編碼標准頒布於1980年,支持的中文漢字比較不全,而gbk是1995年頒布的。所以我猜測使用gbk來解碼從txt中提取的中字也是可以的。但是由於本人被編碼解碼弄得十分煩惱,索性拋棄了py27投入了py3的懷抱,所以無法檢驗我的猜測了。
py3真的完全不需要編碼解碼,直接從txt里面提取出文字然后重命名就可以了。
然后最后要強調的一點是,用readline()讀一行的時候,記得用strip()把換行符去掉啊!!!因為沒有去掉換行符,就一直懷疑是編碼的問題,搞了一個多小時也沒弄出來。
最后我想說,能用代碼做的事情,就不要人工做。第一次感受到了一名程序員能夠給自己創造的便利。
最后把代碼貼上。
#coding:utf-8 import os def rename(): path = "C:/Users/ying/Desktop/pic/step_2" headlinePath = "C:/Users/ying/Desktop/pic/headlines.txt" hlp = open(headlinePath) filelist = os.listdir(path) for file in filelist: oldFileDir = os.path.join(path,file) filetype = os.path.splitext(file)[1] headline = hlp.readline().strip() headline = headline.decode('gb2312','ignore').encode('gbk') print headline newFileName = headline+filetype newFileDir = os.path.join(path,newFileName) try: os.rename(oldFileDir, newFileDir) except: print "test" continue rename()