前言
在使用Python進行網(wǎng)絡編程或者爬取一些自己感興趣的東西時,總避免不了進行一些數(shù)據(jù)傳輸、存取等問題,Python的文件對象以及其他擴展庫,已經(jīng)解決了很多關于文本和二進制數(shù)據(jù)存取的問題,比如網(wǎng)頁內容、圖片音視頻等多媒體內容,但這些數(shù)據(jù)基本是最終的數(shù)據(jù)形態(tài)存儲,有沒有辦法可以存儲Python本身的一些對象數(shù)據(jù),后續(xù)在使用的時候,再直接加載為Python對象即可,本文便講解下常用的Python對象數(shù)據(jù)存取、傳輸解決方案,即pickle、shelve、json。
內容比較基礎,也比較簡單,但也是必須好好掌握的知識點,因為其潛在的應用場景太廣
一、pickle
pickle庫提供了一種將Python對象(所有對象)本地化存儲的解決方案,后續(xù)還可以從這些文件內重新加載,加載后又是Python標準的對象數(shù)據(jù),可以用Python直接使用。
pickle有以下特點:
- 可以存取所有類型Python對象,并本地化到一個文件內
- 每個文件內只能存儲一個Python對象
1.1 臨時轉換
可以將Python對象臨時轉化為pickle序列(存儲在變量內而不是文件內),后續(xù)再進行加載使用。
import pickle
a=[1,2,3,4]
#以下將a轉化為pickle序列
p_a=pickle.dumps(a)
#以下將pickle序列轉化為Python對象
a=pickle.loads(p_a)
1.2 永久化存取
可以將Python對象存儲到本地文件內,方便下次取出繼續(xù)使用。
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對象序列化并存儲到本地文件
后續(xù)可通過加載該文件,將里面存儲的數(shù)據(jù)重新加載為Python對象
二、shelve
shelve庫相當于基于pickle的優(yōu)化,因為pickle單文件只能存儲單個Python對象,并且每次存取都需要使用dump和load,比較繁瑣,所以,該庫主要做了以下優(yōu)化:
- 創(chuàng)建了一個輕量級的鍵值對數(shù)據(jù)庫,支持一個文件內存儲多個Python對象
- 不需要每次都load,對Python數(shù)據(jù)的存取,變成了標準的字典訪問
以下是演示代碼:
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方法創(chuàng)建一個db,可以指定db文件的存儲地址
然后便可以像使用字典一樣,用來在該鍵值對的db內存儲Python對象(任何Python對象)
然后可像字典訪問一樣,重新取出之前已經(jīng)存儲的對象,最后,別忘了戰(zhàn)術性關閉db
如果想遍歷或內省某db內存量鍵值,該db也有keys()和values()方法,也支持Python的迭代協(xié)議
所以,相較于pickle來說,會方便和強大很多
三、json
json是進行網(wǎng)絡數(shù)據(jù)傳輸應用最為廣泛的數(shù)據(jù)格式,其可以將Python指定的一些數(shù)據(jù)對象轉化為json字符串,便于進行存儲和網(wǎng)絡傳輸,并將該json序列化的字符串重新轉變?yōu)镻ython對象。
大體過程為Python→JSON→Python,所以可以進行CS數(shù)據(jù)傳輸和通信。
以下為json和Python數(shù)據(jù)轉換映射表:
JSON |
Python |
object |
dict |
array |
list |
string |
str |
number (int) |
int |
number (real) |
float |
true,false |
Ture,False |
null |
None |
3.1 臨時轉換
可以將Python對象臨時轉化為json字符串并賦值給某變量,待后續(xù)再對其轉化為Python對象
一般用于網(wǎng)絡傳輸,尤其是接口調用時數(shù)據(jù)傳輸。
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字符串并永久性存儲在本地文件內,便于后續(xù)重新加載使用。
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庫內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- pytorch 實現(xiàn)計算 kl散度 F.kl_div()
- Python 機器學習工具包SKlearn的安裝與使用
- python數(shù)據(jù)分析之用sklearn預測糖尿病
- pandas讀取excel,txt,csv,pkl文件等命令的操作
- 基于KL散度、JS散度以及交叉熵的對比