日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(十四)json、pickle与shelve模块

發布時間:2025/5/22 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (十四)json、pickle与shelve模块 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

任何語言,都有自己的數據類型,那么不同的語言怎么找到一個通用的標準?

比如,后端用Python寫的,前端是js,那么后端如果傳一個dic字典給前端,前端肯定不認。

所以就有了序列化這個概念。

什么是序列化?

我們把對象(變量)從內存中變成可存儲或傳輸的過程稱之為序列化,在Python中叫pickling。

序列化之后,就可以把序列化后的內容寫入磁盤,或者通過網絡傳輸進行前后端交互。

反過來,把變量內容從序列化的對象重新讀到內存里稱之為反序列化,即unpickling。

json、pickle模板都可以實現序列化和反序列化,而我們知道的eval則是反序列化。

?

json.dumps():將Python對象通通轉為字符串

import json a = 11 #---->'11' s = 'hello' #---->"hello"------>'"hello"' l = [1,2] #---->'[1,2]' dic = {'name':'nick'} #---->{"name":"nick"}----->'{"name":"nick"}'print(json.dumps(a)) print(json.dumps(s)) print(json.dumps(l)) print(json.dumps(dic))
結果:

11? ? ? ? ? ? ? ? ? ? ? ? #這四個結果都是字符串
"hello"
[1, 2]
{"name": "nick"}

json.dumps()實際干的兩件事:

1.把這個數據中的所有的單引號變為雙引號(有單引號就改為雙引號,沒有就不動)

2.把這個數據變為字符串(在最外面加一對單引號)

json.loads():將字符串轉為Python對象(與eval相似)

所以,用json現實文件存儲:

import jsondic = {'name':'nick'} str_dic = json.dumps(dic) #轉為字符串 f_write = open('123.txt','w') f_write.write(str_dic)f_read = open('123.txt','r') data = f_read.read() data = json.loads(data) #轉回字典 print(type(data)) print(data)
結果:

<class 'dict'>
{'name': 'nick'}

?json

如果我們要在不同的編程語言之間傳遞對象,就必須把對象序列化為標準格式,比如XML,但更好的方法是序列化為JSON,因為JSON表示出來就是一個字符串,可以被所有語言讀取,也可以方便地存儲到磁盤或者通過網絡傳輸。JSON不僅是標準格式,并且比XML更快,而且可以直接在Web頁面中讀取,非常方便。

注意,只有符合json標準格式規范的字符串,才能被解析。在字符串中,json只認雙引號,如下

123.txt: {"name": "nick"} with open('123.txt','r') as f_read:res = f_read.read()res = json.loads(res)print(type(res))print(res)結果:<class 'dict'>{'name': 'nick'}123.txt: {'name': "nick"} #單引號不符合json的標準格式with open('123.txt','r') as f_read:res = f_read.read()res = json.loads(res)print(type(res))print(res)結果:報錯

pickle 

pickle和json的用法幾乎一樣,只是json是將Python對象轉為字符串去存儲或傳輸,而pickle是將Python對象轉為字節去存儲或傳輸,所以pickle適用的數據類型更多,比如類、對象。但是這樣的需求場景很少,所以一般來說,我們還是用json。

用pickle現實文件存儲:

import pickle dic = {'name':'nick'} byte_dic = pickle.dumps(dic) print(byte_dic) with open('aaa.txt','wb') as f_write: #由于是byte,所以這里要+bf_write.write(byte_dic)with open('aaa.txt','rb') as f_read:date = f_read.read()print(type(date))date = pickle.loads(date)print(type(date))print(date)
結果:

b'\x80\x03}q\x00X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00nickq\x02s.'
<class 'bytes'>
<class 'dict'>
{'name': 'nick'}

用eval內置方法可以將一個字符串轉成python對象

用eval現實文件存儲:

dic = {'name':'nick','age':20} f_write = open('123.txt','w') f_write.write(str(dic)) #寫入時直接f_write.write(dic)是報錯的,必須轉為strf_read = open('123.txt','r') data = f_read.read() print(type(data)) #讀取是字符串 data = eval(data) #eval轉為字典 print(type(data)) print(data)
結果:

<class 'str'>
<class 'dict'>
{'age': 20, 'name': 'nick'}

不過,eval方法是有局限性的,對于普通的數據類型,json.loads和eval都能用,但遇到特殊類型的時候,eval就不管用了,所以就要用json。

用json.dumps()將字典轉為字符串是序列化,用json.loads()將字符串轉回字典是反序列化

用pickle.dumps()將字典轉為字節是序列化,用pickle.loads()將字節轉回字典是反序列化

用str()將字典轉為字符串是序列化,用eval()將字符串轉為字典也是反序列化

shelve

最后,簡單了解一下shelve模板,shelve和json、pickle屬于同一類,也是用于數據存儲和傳輸。

shelve是將pickle模板再進一步封裝,目的就是方便我們使用,可以直接把文件當做一個字典來讀和寫,也就是直接操作鍵值對

?shelve模塊只有一個open函數,返回類似字典的對象,可讀可寫;key必須為字符串,而值可以是python所支持的數據類型

import shelve #寫 f = shelve.open(r'abc.txt') #返回一個類似字典的文件對象 f['name'] = 'nick' #插入鍵值對 f['info'] = {'age':20,'num':123321} #value是一個字典 f.close()f = shelve.open(r'abc.txt') #讀 print(f['info']['age']) #直接當做一個字典來讀,二級字典 print(f['name'])

?

轉載于:https://www.cnblogs.com/xulan0922/p/10204034.html

總結

以上是生活随笔為你收集整理的(十四)json、pickle与shelve模块的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。