python3之pickle蔗喂、yaml忘渔、json文件

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é)果顯示二者相等乓搬。

參考文獻

python3 pickle模塊詳解
python yaml用法詳解
讀寫JSON數(shù)據(jù)

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市代虾,隨后出現(xiàn)的幾起案子进肯,更是在濱河造成了極大的恐慌,老刑警劉巖棉磨,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件江掩,死亡現(xiàn)場離奇詭異,居然都是意外死亡乘瓤,警方通過查閱死者的電腦和手機频敛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來馅扣,“玉大人斟赚,你說我怎么就攤上這事〔钣停” “怎么了拗军?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蓄喇。 經(jīng)常有香客問我发侵,道長,這世上最難降的妖魔是什么妆偏? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任刃鳄,我火速辦了婚禮,結(jié)果婚禮上钱骂,老公的妹妹穿的比我還像新娘叔锐。我一直安慰自己挪鹏,他們只是感情好,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布愉烙。 她就那樣靜靜地躺著讨盒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪步责。 梳的紋絲不亂的頭發(fā)上返顺,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音蔓肯,去河邊找鬼遂鹊。 笑死,一個胖子當著我的面吹牛蔗包,可吹牛的內(nèi)容都是我干的秉扑。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼气忠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赋咽?” 一聲冷哼從身側(cè)響起旧噪,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脓匿,沒想到半個月后淘钟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡陪毡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年米母,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毡琉。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡铁瞒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出桅滋,到底是詐尸還是另有隱情慧耍,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布丐谋,位于F島的核電站芍碧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏号俐。R本人自食惡果不足惜泌豆,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吏饿。 院中可真熱鬧踪危,春花似錦蔬浙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兴革,卻和暖如春绎晃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杂曲。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工庶艾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人擎勘。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓咱揍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親棚饵。 傳聞我的和親對象是個殘疾皇子煤裙,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • python基礎語法(9) 內(nèi)置模塊 json json模塊中常用的有兩個方法,分別為: dumps()將pyth...
    棕色試劑瓶閱讀 206評論 0 0
  • 一噪漾、字典基本操作 基本語法:dict = {'ob1':'computer', 'ob2':'mouse', 'o...
    古佛青燈度流年閱讀 2,628評論 0 1
  • 參考網(wǎng)站:https://www.jb51.net/article/135407.htm 在安裝了python 后...
    可樂W閱讀 1,674評論 0 0
  • 常用模塊 認識模塊 什么是模塊 什么是模塊欣硼? 常見的場景:一個模塊就是一個包含了python定義和聲明的文件题翰,文...
    go以恒閱讀 1,943評論 0 6
  • 今天我們班的同學劉一澤被評為“閱讀之星”,得了二等獎诈胜! 我以后要向他學習豹障,學習他認真讀書,寫字工整焦匈。 我要好好的...
    可惜不是你7閱讀 467評論 0 0