使用python將GBK編碼文檔轉(zhuǎn)化為UTF編碼
文件操作說(shuō)明(python3)
這部分簡(jiǎn)單介紹接下來(lái)會(huì)用到的函數(shù)
#open操作創(chuàng)建一個(gè)file對(duì)象,參數(shù)可為r,w,r+,w+,rb
#其中r+和w+不同之處在于r+文件必須事先存在,w+不用
#使用rb參數(shù)后 .read()會(huì)以bytes方式打開(kāi)(后面會(huì)詳說(shuō)bytes)
open('file.c', 'r')
#也可以指定打開(kāi)的編碼
#但要注意rb方式是不能指定encoding方法的
content=open('file.c', 'r', encoding='utf-8')
# 這兩種read方式對(duì)于小文件沒(méi)什么區(qū)別
content.read()
content.readlines()
# write的參數(shù)必須為str類(lèi),這與默認(rèn)read()的返回類(lèi)型相同,都是unicode的
open('file.c','w').write(content+'其他')
編碼問(wèn)題
編碼問(wèn)題是一個(gè)很頭疼的問(wèn)題,在不同操作系統(tǒng),不同國(guó)家,python不同版本都會(huì)存在.
首先明白一點(diǎn),python編碼問(wèn)題是unicode和byte字符串轉(zhuǎn)化直接的問(wèn)題!
在python2中,Unicode字符串和 byte 字符串是可以混合的狸窘,系統(tǒng)試圖幫你解決一切,但這往往帶來(lái)更大的麻煩粱腻。類(lèi)似于int和fload之間的轉(zhuǎn)換,雙向轉(zhuǎn)換并不可行.
來(lái)自wiki和網(wǎng)上文檔的說(shuō)明:
Python 2 悄悄掩蓋了 byte 到 unicode 的轉(zhuǎn)換提鸟,讓程序在處理 ASCII 的時(shí)候更加簡(jiǎn)單帕翻。你付出的代價(jià)就是在處理非 ASCII 的時(shí)候?qū)?huì)失敗。
Python 3最重要的新特性之一是對(duì)字符串和二進(jìn)制數(shù)據(jù)流做了明確的區(qū)分,文本總是Unicode晕拆,由str類(lèi)型表示藐翎,二進(jìn)制數(shù)據(jù)則由bytes類(lèi)型表示.在python3中文本和二進(jìn)制數(shù)據(jù)作了更為清晰的區(qū)分,不再會(huì)對(duì)bytes字節(jié)串進(jìn)行自動(dòng)解碼实幕。文本總是Unicode吝镣,由str類(lèi)型表示,二進(jìn)制數(shù)據(jù)則由bytes類(lèi)型表示
雖然不是標(biāo)準(zhǔn)昆庇,但許多Windows程序(包括Windows記事本)在UTF-8編碼的文件的開(kāi)首加入一段字節(jié)串EF BB BF末贾。這是字節(jié)順序記號(hào)U+FEFF的UTF-8編碼結(jié)果。對(duì)于沒(méi)有預(yù)期要處理UTF-8的文本編輯器和瀏覽器會(huì)顯示成ISO-8859-1字符串???整吆。
簡(jiǎn)單來(lái)說(shuō):
Python 2 將 strings 處理為原生的 bytes 類(lèi)型拱撵,而不是 unicode,
Python 3 所有的 strings 均是 unicode 類(lèi)型表蝙。
理解了這點(diǎn)后,就可以進(jìn)行編碼轉(zhuǎn)換了,簡(jiǎn)言之就是直接decode()成Unicode,然后open()中指定編碼即可,兩句話(huà)的事
但是在python2中,需要進(jìn)行decode('GBK').encode('utf-8')
一系列操作
content =open('333.c','rb',encoding='gbk').read() #content為byte流
new_content=content.decode('gbk') #以gbk解碼以得到Unicode,可以直接write了
open('222.c','w',encoding='utf-8').write(new_content) #在這里編碼就行,
#或者
#采用r+或者w+的方式只能進(jìn)行一次open操作,open之后再怎么鼓搗數(shù)據(jù)
# #最后還是會(huì)以Unicode方式write,相當(dāng)于做了無(wú)用功,所以必須進(jìn)行兩次open
content =open('111.c','r',encoding='gbk').read()
content.close()
open('111.c','w',encoding='utf-8').write(content)
對(duì)文件夾內(nèi)的文件進(jìn)行批量操作
接下來(lái)就簡(jiǎn)單了,使用os.listdir()
并遍歷所有文件.
如果有文件夾直接跳過(guò),只對(duì)文件進(jìn)行操作( 對(duì).tar
.rar
壓縮包會(huì)判斷為文件,但gbk解碼失敗會(huì)調(diào)到異常處理,所以不用擔(dān)心 )
因?yàn)橹虚g有的文件可能已經(jīng)是utf-8 編碼了,所以 try
并拋出錯(cuò)誤 except
.
import os
path = 'E:\\Python\\untitled' #文件夾目錄
files= os.listdir(path) #得到文件夾下的所有文件名稱(chēng)
for file in files: #遍歷文件夾
if not os.path.isdir(file): #判斷是否是文件夾拴测,不是文件夾才打開(kāi)
try:
fGBK = open(path+'\\'+file,'r',encoding='gbk') #嘗試打開(kāi)文件,打不開(kāi)說(shuō)明不是gbk編碼,進(jìn)入異常處理
content = fGBK.read() # 無(wú)異常則繼續(xù)轉(zhuǎn)換
fGBK.close()
fUTF = open(path + '\\' + file, 'w', encoding='utf-8')
fUTF.write(content)
fUTF.close()
print(file + '已經(jīng)轉(zhuǎn)換為UTF-8')
except:
print(file + '不是GBK編碼')