python爬取之json、pickle與shelve庫的深入講解
前言
在使用Python進行網絡編程或者爬取一些自己感興趣的東西時,總避免不瞭進行一些數據傳輸、存取等問題,Python的文件對象以及其他擴展庫,已經解決瞭很多關於文本和二進制數據存取的問題,比如網頁內容、圖片&音視頻等多媒體內容,但這些數據基本是最終的數據形態存儲,有沒有辦法可以存儲Python本身的一些對象數據,後續在使用的時候,再直接加載為Python對象即可,本文便講解下常用的Python對象數據存取、傳輸解決方案,即pickle、shelve、json。
內容比較基礎,也比較簡單,但也是必須好好掌握的知識點,因為其潛在的應用場景太廣
一、pickle
pickle庫提供瞭一種將Python對象(所有對象)本地化存儲的解決方案,後續還可以從這些文件內重新加載,加載後又是Python標準的對象數據,可以用Python直接使用。
pickle有以下特點:
- 可以存取所有類型Python對象,並本地化到一個文件內
- 每個文件內隻能存儲一個Python對象
1.1 臨時轉換
可以將Python對象臨時轉化為pickle序列(存儲在變量內而不是文件內),後續再進行加載使用。
import pickle a=[1,2,3,4] #以下將a轉化為pickle序列 p_a=pickle.dumps(a) #以下將pickle序列轉化為Python對象 a=pickle.loads(p_a)
1.2 永久化存取
可以將Python對象存儲到本地文件內,方便下次取出繼續使用。
import pickle a=[1,2,3,4] f=open('file.pkl','wb') #以下將a轉化為pickle序列並存儲到本地文件 p_a=pickle.dump(a,f) f=open('file.pkl','rb') #以下將存儲在本地文件內的pickle序列轉化為Python對象 a=pickle.load(f) f.close()
以上,首先打開一個文件,註意,因為pickle序列是二進制編碼格式,所以文件模式需要有’b’
然後將Python對象序列化並存儲到本地文件
後續可通過加載該文件,將裡面存儲的數據重新加載為Python對象
二、shelve
shelve庫相當於基於pickle的優化,因為pickle單文件隻能存儲單個Python對象,並且每次存取都需要使用dump和load,比較繁瑣,所以,該庫主要做瞭以下優化:
- 創建瞭一個輕量級的鍵值對數據庫,支持一個文件內存儲多個Python對象
- 不需要每次都load,對Python數據的存取,變成瞭標準的字典訪問
以下是演示代碼:
import shelve db=shelve.open('obj_db') class A:... a=[1,2,3];b=dict(name='dennis');c=A db['a']=a db['b']=b db['c']=c db['a'] db['b'] db['c'] db.close()
以上代碼,首先使用shelve的open方法創建一個db,可以指定db文件的存儲地址
然後便可以像使用字典一樣,用來在該鍵值對的db內存儲Python對象(任何Python對象)
然後可像字典訪問一樣,重新取出之前已經存儲的對象,最後,別忘瞭戰術性關閉db
如果想遍歷或內省某db內存量鍵值,該db也有keys()和values()方法,也支持Python的迭代協議
所以,相較於pickle來說,會方便和強大很多
三、json
json是進行網絡數據傳輸應用最為廣泛的數據格式,其可以將Python指定的一些數據對象轉化為json字符串,便於進行存儲和網絡傳輸,並將該json序列化的字符串重新轉變為Python對象。
大體過程為Python→JSON→Python,所以可以進行CS數據傳輸和通信。
以下為json和Python數據轉換映射表:
JSON | Python |
---|---|
object | dict |
array | list |
string | str |
number (int) | int |
number (real) | float |
true,false | Ture,False |
null | None |
3.1 臨時轉換
可以將Python對象臨時轉化為json字符串並賦值給某變量,待後續再對其轉化為Python對象
一般用於網絡傳輸,尤其是接口調用時數據傳輸。
import json mylist=[1,2,3] mydict={ 'name':dennis } #臨時轉換 a=json.dumps(mydict) b=json.dumps(mylist) #將json字符串重新轉為Python對象 mylist=json.loads(b) mydict=json.loads(a)
3.2 永久化存取
可以將Python對象轉換為json字符串並永久性存儲在本地文件內,便於後續重新加載使用。
import json mylist=[1,2,3] mydict={ 'name':dennis } #將Python對象轉化為json字符串,同時存儲到file內 with open('myjson.json','w') as f: json.dump(mydict,f) #將存儲在文件內的json字符串加載並轉化為Python對象 with open('myjson.json','r') as f: json.load(f)
總結
到此這篇關於python爬取之json、pickle與shelve庫的文章就介紹到這瞭,更多相關python json、pickle與shelve庫內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python序列化模塊之pickle與json詳解
- Python常用標準庫詳解(pickle序列化和JSON序列化)
- Python3 pickle模塊的使用方法詳細介紹
- 老生常談Python中的Pickle庫
- 關於 Python json中load和loads區別