1、pickle
1.1 簡介
- pickle可以將字符串缰儿、列表畦粮、字典等數(shù)據(jù)保存在文件中,同時也可以從文件中重新加載這些數(shù)據(jù)乖阵。
- 常見的四個函數(shù):
-
pickle.dump(obj, file)
將字符串等對象保存到文件中; -
pickle.load(file)
從文件中加載數(shù)據(jù); -
pickle.dumps(obj)
將字符串等對象序列化成string形式宣赔; -
pickle.loads(string)
將string反序列化成原來的obj對象。 - 總結(jié):涉及到文件的不帶s瞪浸;涉及到字符串的帶s儒将。
-
1.2 實例
1)對字典進行dump和load操作
# pickle_dump_load.py
import pickle
a = {"name": "Tom", "age": 10}
with open("text.pkl", "wb") as file:
pickle.dump(a, file)
with open("text.pkl", "rb") as file:
b = pickle.load(file)
print("b type: ", type(b))
print("b: ", b)
第1行,當前程序的文件名稱為pickle_dump_load.py对蒲。
第2行钩蚊,導入序列化需要的模塊pickle。
第4行蹈矮,創(chuàng)建包含兩個鍵值對的字典a砰逻。
第5行,打開名稱為text.pkl的文件(如果當前路徑下不存在含滴,則自動創(chuàng)建)诱渤;"wb"表示對文件進行“寫入”操作;file代表當前打開的該文件對象谈况,可自由命名勺美。
第6行,將字典對象a寫入到文件file中碑韵。
第7行赡茸,打開當前路徑下的text.pkl文件;"rb"表示對文件進行“讀入操作”祝闻。
第8行占卧,從文件file中讀入內(nèi)容遗菠,并存儲在b中。
第10-11行华蜒,顯示對象b的類型和內(nèi)容辙纬。
?? 第5行、第7行一定要是'wb'和'rb'叭喜,如果只是'w'和'r'會報錯贺拣。
OUT:
b type: <class 'dict'>
b: {'name': 'Tom', 'age': 10}
2)對列表進行dumps和loads操作
# pickle_dumps_loads.py
import pickle
info = [1, 2, 3, 'abc']
data1 = pickle.dumps(info)
data2 = pickle.loads(data1)
print("原始數(shù)據(jù) info: ", info)
print("序列化后數(shù)據(jù) data1: ", data1)
print("反序列化后數(shù)據(jù) data2: ", data2)
第1行,當前程序的文件名稱為pickle_dumps_loads.py捂蕴。
第2行譬涡,導入序列化需要的模塊pickle。
第4行啥辨,創(chuàng)建一個列表涡匀,命名為info。
第5-6行溉知,將info序列化成data1陨瘩,將data1反序列化成data2。
第8-10行级乍,顯示info拾酝、data1、data2卡者。
OUT:
原始數(shù)據(jù) info: [1, 2, 3, 'abc']
序列化后數(shù)據(jù) data1: b'\x80\x03]q\x00(K\x01K\x02K\x03X\x03\x00\x00\x00abcq\x01e.'
反序列化后數(shù)據(jù) data2: [1, 2, 3, 'abc']
2蒿囤、yaml
YAML是一種直觀的能夠被電腦識別的的數(shù)據(jù)序列化格式,容易被人類閱讀崇决,并且容易和腳本語言交互材诽。YAML類似于XML,但是語法比XML簡單得多恒傻,對于轉(zhuǎn)化成數(shù)組或可以hash的數(shù)據(jù)時是非常簡單有效的脸侥。
常見的四個函數(shù):
-
yaml.load()
將yaml文件轉(zhuǎn)成python對象 -
yaml.dump()
將python對象轉(zhuǎn)成yaml文件 -
yaml.dump_all()
將多個python對象生成到一個yaml文件中 -
yaml.load_all()
將一個含有多個python對象的yaml文件轉(zhuǎn)成多個python對象
2.1 通過yaml.load()
方法將yaml文件轉(zhuǎn)成python對象
1)yaml文件轉(zhuǎn)字典對象,冒號(:)
# config_dict.yaml
name: 灰藍
age: 0
job: Tester
可以轉(zhuǎn)成:
{'name': '灰藍', 'age': 0, 'job': 'Tester'}
2)yaml文件轉(zhuǎn)列表對象盈厘,短線(-)
# config_list.yaml
- 灰藍
- 0
- Tester
可以轉(zhuǎn)成:
['灰藍', 0, 'Tester']
3)yaml文件轉(zhuǎn)字典和列表的復合結(jié)構對象
3.1)外層是列表睁枕、里層是字典
# config_list_dict.yaml
- name: 灰藍
age: 0
- name: James
age: 30
可以轉(zhuǎn)成:
[{'name': '灰藍', 'age': 0}, {'name': 'James', 'age': 30}]
從文件config_list_dict.yaml中可以看出:
- 最外層是兩條短線(-),表示列表沸手;
- 次外層是鍵值對形式(:)外遇,表明是字典;
- 所以輸出結(jié)果中契吉,外層是列表跳仿,里面有兩項,例如
{'name': '灰藍', 'age': 0}
,{'name': 'James', 'age': 30}
捐晶;里面的每一項均是字典菲语,字典中有兩個鍵值對妄辩。
3.2)外層是字典、里層是列表
# config_dict_list.yaml
name:
- 灰藍
- James
age:
- 0
- 30
可以轉(zhuǎn)成:
{'name': ['灰藍', 'James'], 'age': [0, 30]}
從文件config_dict_list.yaml可以看出:
- 最外層是鍵值對形式(:)山上,表示字典眼耀;次外層是短線(-),表示列表佩憾;
- 所以輸出結(jié)果中畔塔,外層是字典,包含兩個鍵值對
name': ['灰藍', 'James']
和'age': [0, 30]
鸯屿;里層每個鍵值對的值是列表,例如第一個鍵值對的值為['灰藍', 'James']
把敢。
4)python實現(xiàn)將一個較為復雜的字典寄摆、列表復合的yaml文件轉(zhuǎn)成python對象的過程。
# config.yaml
name: Tom Smith
age: 37
spouse:
name: Jane Smith
age: 25
children:
- name: Jimmy Smith
age: 15
- name1: Jenny Smith
age1: 12
# test_yaml.py
import yaml
f = open('config.yml')
y = yaml.load(f)
print (y)
OUT:
{'name': 'Tom Smith', 'age': 37, 'spouse': {'name': 'Jane Smith', 'age': 25}, 'children': [{'name': 'Jimmy Smith', 'age': 15}, {'name1': 'Jenny Smith', 'age1': 12}]}
整理后的輸出結(jié)果:
{
'name' : 'Tom Smith',
'age' : 37,
'spouse' : {'name': 'Jane Smith',
'age' : 25},
'children': [{'name': 'Jimmy Smith',
'age' : 15},
{'name1':'Jenny Smith',
'age1' : 12}]
}
通過整理后的輸出結(jié)果與config.yaml文件的對比就可以找到test_yaml.py是怎樣對config.yaml文件進行解析修赞。
2.2 通過yaml.dump()
將python對象生成yaml文件
import yaml
a = {'name': 'Tom Smith', 'age': 37, 'spouse': {'name': 'Jane Smith', 'age': 25}, 'children': [{'name': 'Jimmy Smith', 'age': 15}, {'name1': 'Jenny Smith', 'age1': 12}]}
f = open('config.yaml', 'w') # 'w'表示寫入文件
yaml.dump(a, f)
OUT:
2.3 通過 yaml.dump_all()
將多個python對象生成到一個yaml文件中
import yaml
obj1 = {"name": "James", "age": 20}
obj2 = ["Lily", 19]
with open('config.yaml', 'w') as f:
yaml.dump_all([obj1, obj2], f)
查看文件config.yaml中的文件內(nèi)容如下:
age: 20
name: James
---
- Lily
- 19
2.4 通過yaml.load_all()
將一個含有多個python對象的yaml文件轉(zhuǎn)成多個python對象
import yaml
f = '''
name: James
age: 20
---
name: Lily
age: 19
'''
y = yaml.load_all(f)
for data in y:
print(data)
??y = yaml.load_all(f)
中婶恼,生成的f是迭代器,所以通過循環(huán)方式進行打印柏副。
??f中包含的兩個對象以 (---)進行分割
OUT:
{'name': 'James', 'age': 20}
{'name': 'Lily', 'age': 19}
3勾邦、json文件
JSON數(shù)據(jù)全稱是JavaScript Object Notation編碼格式的數(shù)據(jù)。
python中的json
模塊模塊提供了一種很簡單的方式來編碼和解碼JSON數(shù)據(jù)割择。
3.1 json.dumps()
和 json.loads()
- 函數(shù)末尾有s眷篇,針對于字符串;
-
json.dumps()
將python對象(列表荔泳、字典等)轉(zhuǎn)變成json字符串蕉饼; -
json.loads()
將json字符串轉(zhuǎn)變成python對象
實例:
import json
data1 = {
'name': 'ACME',
'shares': 100,
'price': 542.23
}
json_str = json.dumps(data1)
data2 = json.loads(json_str)
print('data1: ', data1)
print('json_str: ', json_str)
print('data2: ', data2)
print('data1 type: ', type(data1))
print('json_str type: ', type(json_str))
print('data2 type: ', type(data2))
第1行,導入json模塊玛歌。
第3-7行昧港,創(chuàng)建字典data1。
第9行支子,通過json.dumps()
方法將data1轉(zhuǎn)成json字符串创肥,并將其存儲在json_str中。
第10行值朋,將json_str字符串轉(zhuǎn)成對應的python對象叹侄,存儲于data2中。
第12-18行昨登,打印出data1圈膏、json_str、data2的值及對應的類型篙骡。
OUT:
data1: {'name': 'ACME', 'shares': 100, 'price': 542.23}
json_str: {"name": "ACME", "shares": 100, "price": 542.23}
data2: {'name': 'ACME', 'shares': 100, 'price': 542.23}
data1 type: <class 'dict'>
json_str type: <class 'str'>
data2 type: <class 'dict'>
3.2 json.dump()
和json.load()
- 函數(shù)末尾沒有s稽坤,針對于文件
-
json.dump(obj, file)
將python對象存儲于文件file中丈甸; -
json.load(file)
從文件file中加載出python對象。
實例:
import json
data1 = {
'name': 'ACME',
'shares': 100,
'price': 542.23
}
# Writing JSON data
with open('data.json', 'w') as f:
json.dump(data1, f)
# Reading data back
with open('data.json', 'r') as f:
data2 = json.load(f)
print("data1 == data2: ", data1 == data2)
OUT:
data1 == data2: True
第10行尿褪,打開文件data.json(當前目錄下如果不存在data.json睦擂,則創(chuàng)建);'w'表示對文件data.json進行“寫入”操作杖玲。
第11行顿仇,將data1字典寫入到文件中惭等。
第14行媳板,與第10行正好相反沃测;'r'表示對文件data.json進行“讀取”操作扯俱。
第15行课幕,從文件中讀取內(nèi)容悲没,并存儲到data2中吗坚。
第17行疹吃,判斷data1和data2是否一直蕉毯,輸出結(jié)果顯示二者相等乓搬。