您好,登錄后才能下訂單哦!
前言
python2.x版本的字符編碼有時讓人很頭疼,遇到問題,網上方法可以解決錯誤,但對原理還是一知半解,本文主要介紹 python 中字符串處理的原理,附帶解決 json 文件輸出時,顯示中文而非 unicode 問題。首先簡要介紹字符串編碼的歷史,其次,講解 python 對于字符串的處理,及編碼的檢測與轉換,最后,介紹 python 爬蟲采取的 json 數據存入文件時中文輸出的問題。
參考書籍:Python網絡爬蟲從入門到實踐 by唐松
在python 2或者3 ,字符串編碼只有兩類 :
(1)通用的Unicode編碼;
(2)將Unicode轉化為某種類型的編碼,如UTF-8,GBK;
1、計算機歷史:
計算機只處理數字,因此處理文本時,必須轉換成數字才行。
8位(bit)=1字節(byte)=256種不同狀態=從000000到111111;
1GB=1024M=1024(1024kb)=1024(1024(1024b));
ASCII編碼 是對應英文字符與二進制數字之間的關系;ASCII一共規定了128種,如大寫字母A是65,即01000001;可見一字母一字節;
GB2312編碼 簡體中文常見的編碼,兩個字節代表一個中文漢字 ,理論上256*256個編碼,即可表示65536種中文字;
各國編碼不同,為了各國能擴平臺進行文本的轉換與處理,Unicode就被作為統一碼或者單一碼。Unicode編碼通常是兩個字節,unicode與ASCII編碼的區別,在于unicode在ASCII編碼前加了一個0,即字母A的ASCII編碼為01000001,unicode編碼即為0000000001000001;但英文字母其實只用一個字節就夠了,unicode編碼寫英文時多了一個字節,浪費存儲空間。因而unicode開發了通用轉換格式(Unicode Transformation Format(UTF)),常見的有utf-8或者utf-16;
要明白encode()和decode()的區別
encode()的作用是將Unicode編碼的字符串轉換為其他編碼格式。
例如: st1.encode("utf-8")
這句話的作用是將Unicode編碼的st1編碼為utf-8編碼的字符串
decode()的作用是把其他編碼格式的字符串轉換成Unicode編碼的字符串。
例如: st2.decode("utf-8")
這句話的作用是將utf-8編碼的字符串st2解碼為Unicode編碼的字符串
第二,除Unicode編碼的字符串以外,任何一種編碼的字符串要想轉換為其他編碼格式,必須先解碼后編碼
非Unicode編碼--> Unicode編碼-->非Unicode編碼
例如,utf-8編碼的字符串st想要轉換為gbk編碼的字符串,必須經過以下步驟:
st=st.decode("utf-8") #解碼為Unicode編碼 st=st.encode("gbk") #從Unicode編碼編碼為gbk編碼
第三,我們經常使用的utf-8編碼還分為有BOM的和無BOM的。
第四:關于json文件的中文編碼。用Python讀取Json文件時經常用到json.load()函數,該函數對json文件的格式是有要求的
1)json文件是utf-8 without BOM編碼的,那么可以直接用json.load(filename)
函數讀取json文件的內容
2)json文件是utf-8 with BOM編碼的,不能用json.load()
函數讀取,json.load()
不能正確識別
3)json文件時其他編碼的,比如gbk, 要把json文件的編碼格式作為一個參數傳給json.load()
:
eg. json.load(filename,"gbk")
第五,怎么查看并且設置自己文件的編碼呢。
介紹一個個人比較喜歡的工具"Nodtepad++",隨便一個軟件管家里就與一鍵安裝。
用這個工具你可以方便的查看自己的文件的當前編碼,并可以輕松轉換成任意其他編碼格式
2、python字符編碼
參考地址:https://www.jb51.net/article/139878.htm
(1)encode的作用是,將unicode對象編碼成其他編碼的字符串,str.encode('utf-8'),編碼成UTF-8;(2)decode的作用是將其他編碼的字符串轉換成Unicode編碼,str.decode('UTF-8');
爬取網頁時,可在F12 elements meta中查看網頁編碼方式,如圖:
(2)中文,Python中的字典能夠被序列化到json文件中存入json
with open("anjuke_salehouse.json","w",encoding='utf-8') as f: json.dump(all_house,f,ensure_ascii=False,sort_keys=True, indent=4); print(u'加載入文件完成...');
存儲數據如圖:
json.dumps()/json.loads()等用法
json_str = json.dumps(all_house,ensure_ascii=False); #all——books 為列表、字典等python自帶的數據結構,將其寫成json #print json_str; #[{"brokername": "王東宇"},{},{}] new_dict = json.loads(json_str);#主要是讀json文件時,需要用到 #print new_dict; #{u'house_area': u'95', u'build_year': u'2005'}
{"name": "xiaoming"}
json.loads() 是將一個JSON編碼的字符串(字典形式)轉換為一個Python數據結構,{u'name': u'xiaoming'}
dumps轉化后鍵與值都變成了雙引號,而在loads后變成python變量時,元素都變成了單引號,并且字符串前加多了個u。
一般要求當要字符串通過loads轉為python數據類型時,得外層用單引號,里面元素key和value用雙引號。
dump與dumps的區別
dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding='utf-8', default=None, sort_keys=False, **kw);
dump將一個對象序列化存入文件,dump需要一個類似于文件指針的參數(并不是真的指針,可稱之為類文件對象),可以與文件操作結合,也就是說可以將dict轉成str存入文件中,如json.dump(all_house,f,ensure_ascii=False,sort_keys=True, indent=4)
中的f表示一個數據待寫入的json文件句柄;dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding='utf-8', default=None, sort_keys=False, **kw);而dumps(str)
直接給的是str,也就是直接將字典轉成str,無需寫入文件,類似一個數據格式的轉換方法,將python字符串轉成json字典。(3)中文存入txt
f=open('net_saving_data.txt','w',encoding='utf-8'); for item in all_house: # house_area=item['house_area']; # price=item['price']; output='\t'.join([str(item['house_area']),str(item['price']),str(item['build_year']),str(item['house_title'])]); f.write(output); f.write('\n'); f.close();
!!NOTE
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。