python
unicode
bytes
str編碼
一、簡單的編碼介紹
但是py3裡,只有 unicode編碼格式 的位元組串才能叫作str。
其他編碼格式的統統都叫bytes,如:gbk,utf-8,gb2312…………
在py3中,unicode編碼就像是乙個樞紐,例如gbk的格式要想轉化成utf-8,那麼必須先轉化成unicode,然後再從unicode轉化成utf-8。
編碼格式轉換.png
二、老大難的檔案操作
python各種各樣的擴充套件卡確實給我們帶來了極大的方便,但是對於初學者而言,編碼問題卻一而再再而三的出現,尤其以檔案操作最為明顯(反正我是這樣的)python讀寫檔案估計大家都用open內建函式,但是用open方法開啟會有一些問題。open開啟檔案只能寫入str型別,不管字串是什麼編碼方式。例如接下來將主要介紹檔案讀寫操作和檔案編碼方式檢測的方法。
>>> fr = open('test.txt','a')
>>> line1 = "我愛祖國"
>>> fr.write(line1)
這樣是完全可以的。但是有時候我們爬蟲或者其他方式得到一些資料寫入檔案時會有編碼不統一的問題,所以就一般都統一轉換為unicode。此時寫入open方式開啟的檔案就有問題了。例如
>>> line2 = u'我愛祖國'
>>> fr.write(line2)
traceback (most recent call last):
file "", line 1, in
fr.write(line2)
unicodeencodeerror: 'ascii' codec can't encode characters in position 0-11: ordinal not in range(128)
>>>
怎麼辦,我們可以將上面的line2編碼成str型別,但是太麻煩。我們要把得到的東西先decode為unicode再encode為str。。。
input檔案(gbk, utf-8...) ----decode-----> unicode -------encode------> output檔案(gbk, utf-8...)
代替這繁瑣的操作就是codecs.open,例如
>>>
import
codecs
>>> fw = codecs.open('test1.txt','a','utf-8')
>>> fw.write(line2)
>>>
不會報錯,說明寫入成功。這種方法可以指定乙個編碼開啟檔案,使用這個方法開啟的檔案讀取返回的將是unicode。寫入時,如果引數 是unicode,則使用open()時指定的編碼進行編碼後寫入;如果是str,則先根據源**檔案宣告的字元編碼,解碼成unicode後再進行前述 操作。相對內建的open()來說,這個方法比較不容易在編碼上出現問題。
上文中介紹的codecs.open()方法雖然明顯比open要方便好用很多,但是使用這個函式的前提是我們需要知道檔案的編碼方式,但是事實是我們大多數情況下不知道檔案的編碼方式,所以一下給出兩種解決辦法。ways = ["utf-8","gbk","gb2312","ascii","unicode"]
for encoding in ways:
print(encoding)
try:
with codecs.open("test.csv","r",encoding=encoding) as f:
data = f.read()
print(type(data))
break
except exception as e:
pass
將python中常用的編碼方式用list表示,然後用for迴圈逐一帶入檢驗。由於utf-8和gbk用的較多,所以建議放在list的最前面。
一旦檔案操作成功,則break,跳出迴圈。
可以以bytes的形式對檔案進行操作,這樣即使不知道檔案的編碼方式也同樣可以進行讀寫操作了,但是在最後需要進行decode或者encode。with codecs.open("test.csv","rb") as f:如果對decode和encode不了解,請閱讀這篇文章python編碼問題之"encode"&"decode"
data = f.read()
print(type(data))
encodeinfo = chardet.detect(data)
print(data.decode(encodeinfo["encoding"]))
親測得到的結果如下圖
4.png
解釋一下上面的**中的chardet.detect()
chardet是乙個python3自帶的庫,用於檢測文字的編碼方式,他會返回乙個字典,格式是但是注意它一般只能檢測bytes型別的編碼格式,比如
import
chardet
a = "你好"
print(type(a))
chardet.detect(a)
>>>
traceback
(most recent call last):
file "e:\code\python\flask\csv-mysql\test.py"
, line 63, in
chardet.detect(a)
file "c:\python35\lib\site-packages\chardet\__init__.py", line 25, in detect
raise valueerror('expected a bytes object, not a unicode object')
valueerror: expected a bytes object, not a unicode object
提出的建議是
end
python3編碼問題終結者 還搞不懂你來找我
python unicode bytes str編碼 一 簡單的編碼介紹 但是py3裡,只有 unicode編碼格式 的位元組串才能叫作str。其他編碼格式的統統都叫bytes,如 gbk,utf 8,gb2312 在py3中,unicode編碼就像是乙個樞紐,例如gbk的格式要想轉化成utf 8,...
《終結者 洛谷》第3章
soha 大家堅持住啊!一定要殺出去!soha身邊只剩下vercont和一扶蘇一2個人了 high score率領這近200個綠名士兵將soha 一次又一次的打敗,也逐漸縮小包圍圈,soha危在旦夕 vercont和 一扶蘇一拿著分塊盾牌拼死抵擋,但馬上要堅持不住了 難道,我們要葬身此地了 忽然,乙...
2017京東校招終結者問題
題目描述 收到情報,有批新造的機械人要運輸到前線。小c將去破壞機械人的運輸。小c將雷射炮放置在公路的一旁,等運輸車經過的時候發射 假設雷射炮一定可以射穿車輛 由於能源有限,雷射炮只能發射兩次。可以認為雷射炮放在座標軸的原點處,並向y軸正方向發射。每輛運輸車可以看作是乙個矩形,起始的x軸座標為xi 所...