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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python中常用的序列化模块_第六章 常用模块(5):python常用模块(序列化模块:pickle,json,shelve,xml)...

發布時間:2025/3/21 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python中常用的序列化模块_第六章 常用模块(5):python常用模块(序列化模块:pickle,json,shelve,xml)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

6.3.7 序列化模塊 (pickle,json,shelve,xml)

文件寫入,數據傳輸時,我們都是以字符串形式寫入的(因為字符串可以encode成bytes)。

那其他類型(比如字典,列表等)想寫入文件時如何處理呢?

這時候我們就需要一種操作,叫做序列化。

+那什么是序列化呢?

+ 把內存數據(unicode)轉成字符(bytes類型),叫做序列化。

>序列化用于存入硬盤或者網絡傳輸等

+ 把字符轉成內存數據,叫反序列化。

簡單點說,就是:

序列化: 其他類型數據 --> 字符類型

反序列化: 字符類型 --> 其他數據類型

>字符類型:str, bytes or bytearray

可以序列化,反序列化的模塊有以下2種:

pickle

json

這兩種模塊的用法完全一樣

用eval()方法也可以達到效果。那有什么區別呢?

1. json模塊 (.json文件)

序列化成字符串類型

json特點

需要用open打開文件再處理

用'w','r'等類型打開文件進行

序列化成字符串類型

文件擴展名用.json

json與pickle的區別:

json能識別的數據類型:str,int,tuple,list,dict

json可以跨平臺使用

import json

json.dump(obj,fp,skipkeys,...)

將obj序列化成字符串類型,并寫入文件對象fp中。返回None

json.dumps():將數據轉成字符串并存到內存

這個一般用在:1.網絡數據傳輸 2.跨平臺,跨語言的數據交互

json.load(fp,cls,...)

讀取json序列化的文件對象fp,反序列,返回反序列后的數據

json.loads():讀取dumps的數據,并反序列

import json

data = {'name': 'Alex', 'age': 22, 'salary': [1, 2, 3]}

# d1 = json.dumps(data) # 把data序列化。 ->序列化后轉為str類型

# d2 = json.loads(data) # 把data反序列化。 ->反序列化轉成相應數據類型(字典,列表等)

with open('test.json','w') as f: # 一般json序列化的文件擴展名用.json

d1 = json.dump(data,f) # 把data序列化,并且寫入文件對象f中。因為返回None,所以d1是None

with open('test.json','r') as f:

d2 = json.load(f) # 把文件對象f的數據反序列化,返回給d2

拓展:數據交互方式有2種:json,xml

json 可讀性,數據大小 都優越于 xml

Azure的舊環境用的xml,新環境用的json

2. pickle模塊 (.pkl文件)

序列化成bytes類型。

注意:因為序列化成bytes類型,所以文件的讀寫要用rb,wb等模式來進行!

pickle特點

需要用open打開文件再處理

用'wb','rb'等類型打開文件進行

序列化成bytes類型

文件擴展名用.pkl

pickle與json的區別:

pickle支持python里所有的數據類型(比如函數,類什么的都可以)

所以python使用的文件,不論內容時什么我們都可以pickle

pickle只能在python里使用

import pickle

pickle.dump(obj,file,protocol,...)

將obj序列化成bytes類型,并寫入file文件,如果沒有會創建文件。返回None

pickle.load(file,...)

讀取json序列化的文件對象fp,反序列,返回反序列后的數據

.loads():讀取dumps的數據,并反序列

import pickle

data = [1, 2, 3]

d1 = pickle.dumps(data) # 把data序列化。 ->序列化后轉為bytes類型

d2 = pickle.loads(d1) # 把data反序列化。 ->反序列化轉成相應數據類型

with open('test.pkl', 'wb') as f: # 一般pickle序列化的文件擴展名用.pkl

pickle.dump(data, f)

with open('test.json', 'rb') as f:

d = pickle.load(f)

print(type(d1))

print(type(d2))

print(d)

3. shelve模塊 ()

shelve對pickle進行了封裝,并且可以多次dump和load

區別及特點:

pickle

一個文件只能dump一次(因為dump多次容易混亂)

用open()函數打開文件

shelve

可以對文件多次dump,load

用shelve模塊的.open()方法打開文件

數據的結構類似dict

可以直接用類似處理dict的方法處理數據

序列化:

import shelve

f = shelve.open('shelve_test') # 打開(沒有就創建)文件。會創建多個文件。可以跟open一樣用with

list1 = ['a','b','c','d']

dict1 = {'key1':'abcd','key2':'1234'}

f['li1'] = list1 # 持久化列表 --> 就是寫入序列化文件中,并且有個名字是'li1'

f['d1'] = dict1 # 持久化字典 --> 就是寫入序列化文件中,并且有個名字是'd1'

f.close() # 關閉保存

反序列化:

import shelve

with shelve.open('shelve_test') as f:

print(f['li1']) # 直接調用li1的數據

print(f['d1']) # 直接調用d1的數據

# shelve打開的文件對象構造類似字典,可以使用字典的方法:

print('get li1:', f.get('li1')) # 有get()方法

i = f.items() # 有items()方法。 注意:這個i指向f.items()的內存地址,f.items()的值變化,i也會隨之變化

print(id(i))

print(i) # 返回值是shelve對象類型,不能直接使用

print(list(i)) # 所以需要list()轉換一下才可以看到內容

f['li2'] = ['aaaa','bbbb'] # 可以追加新的數據

print(list(i))

f.pop('li2') # 可以刪除

print(list(i))

f['li1'] = [2, 3, 4, 5] # 可以直接修改某個數據的整個內容

print(list(i))

f['li1'][1] = 'b' # 但是不能改其中的一部分內容(字典可以)

print(list(i)) # 結果并沒有改變

print(id(i))

4. xml模塊 (.xml)

作用和json一樣,是json出現之前很常用的序列化模塊。

構造也和字典類似。用<>來定義數據。

讀取xml文檔內容:

# 讀取數據

import xml.etree.ElementTree as ET

tree = ET.parse('test.xml') # 打開xml文件,返回xml對象

root = tree.getroot() # 取數據最上級key

# print(dir(root)) # 可以顯示數據的keys

print(root.tag)

# 遍歷文檔

for child in root:

print(child.tag, child.attrib)

for i in child:

print(i.tag, i.attrib)

# 只遍歷year節點

for node in root.iter('year'):

print(node.tag, node.text)

修改和刪除xml文檔內容:

# 修改數據

import xml.etree.ElementTree as ET

tree = ET.parse('test.xml')

root = tree.getroot() # 取數據最上級key

# 修改

for node in root.iter('year'):

new_year = int(node.text) + 1 # 取數據并計算

node.text = str(new_year) # 把值轉成str并賦值給原來的內容

node.set('update', 'yes') # 設置屬性和值

tree.write('test.xml') # 內容寫入文件

# 刪除數據

import xml.etree.ElementTree as ET

tree = ET.parse('test.xml')

root = tree.getroot() # 取數據最上級key

# 刪除node

for country in root.findall('country'):

rank = int(country.find('rank').text)

if rank > 50:

root.remove(country)

tree.write('output.xml') # 結果寫到一個新文件里

創建xml文件

```python

# 創建xml文件

import xml.etree.ElementTree as ET

root = ET.Element('namelist') # 創建名為namelist的根(root)

name1 = ET.SubElement(root,'name',attrib={'enrolled':'yes'}) # 名稱為'name'的數據放在'root'的節點上,屬性設為{'enrolled':'yes'}

age = ET.SubElement(name1,'age',attrib={'checked':'no'}) # 名稱為'age'的數據放在name1的節點上,屬性設置為 {'checked':'no'}

sex = ET.SubElement(name1,'sex') # 名稱為'sex'的數據放在name1的節點上

sex.text = '33' # sex的值設為'33'

name2 = ET.SubElement(root,'name',attrib={'enrolled':'no'}) # 名稱為'name'的數據放在'root'的節點上,屬性設為{'enrolled':'yes'}

age = ET.SubElement(name2,'age') # 名稱為'age'的數據放在name2的節點上

age.text = '19' # age的值設為'19'

et = ET.ElementTree(root) # 生成文檔對象

et.write('test.xml', encoding='utf-8', xml_declaration=True) # xml_declaration是要不要加版本號聲明

ET.dump(root)

```

總結

以上是生活随笔為你收集整理的python中常用的序列化模块_第六章 常用模块(5):python常用模块(序列化模块:pickle,json,shelve,xml)...的全部內容,希望文章能夠幫你解決所遇到的問題。

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