小資料存儲
我們在編寫代碼的時候,經常會涉及到資料存儲的情況,如果是爬蟲得到的大資料,我們會選擇使用資料庫,或者excel存儲。但如果隻是一些小資料,或者說關聯性較強且存在存儲後複用的資料,我們該如何存儲呢?
使用open儲存文本
最簡單、粗暴+無腦的存儲方式就是儲存成一個文本文檔了。
使用open函數,将結果一行行的儲存成文本,這裡涉及的知識點隻有簡單的幾條:
- 檔案讀寫模式,r 、w、a、b、+ ,掌握這幾種即可。
- 使用單獨的open打開檔案時,需要注意結尾時的調用close()函數關閉文檔
- 推薦使用上下文管理器的with open操作
csv檔案
之是以将csv與excel分開說,首先需要掃盲下,csv屬于特定格式的文本檔案(使用逗号分隔),而excel是二進制檔案。
csv可以直接使用文本編輯器打開,excel不行…
其實csv檔案,完全可以使用open函數進行儲存,隻要你将每行資料都使用,分隔開即可。
另外,python自帶csv庫,可以很友善的操作與儲存該資料
xml檔案
xml檔案的方式,已經逐漸被淘汰了,為什麼這麼說?因為它繁瑣的樹形結構,導緻了在傳輸過程中,占用了更多的記憶體。是以,除非必要,真的不推薦以xml的形式存儲你的資料…
configparser
python子產品中configparser是一個專門用來儲存配置檔案的子產品庫,它非常适合儲存一些具有關聯性的資料内容,尤其是配置檔案。通過定義section的方式,在section中添加key:value的方式,可以直覺明了的資料内容。我之前專門寫了一篇關于它的文章,會附在公衆号的字文章中,喜歡的朋友可以去看看。
pyyaml
yaml類型的檔案已經成為很多Linux下的主流配置檔案類型,比如Docker、Ansible等等都在使用yaml,但它依然不是一個主流的資料存儲方式,因為yaml本身的格式要求太過嚴苛,比結構化的Python格式更為嚴格,喜歡的朋友可以去研究下…
pickle
pickle子產品的使用面很窄,但不得不說還是有些人會使用,是以簡單說些它的優劣:
優勢:接口簡單(與json相似);存儲格式通用型,及在Windows、Linux等平台下通用;二進制存儲,效率高
劣勢:pickle是python特定的協定,其他語言無法使用;pickle存在安全性,這個要着重說下,看下圖
Json檔案
說了上面那麼多,壓軸的還是Json!
首先相對于xml,現在更多的網站在資料傳輸中使用json格式,因為同等的位元組下,json傳輸資料的效率要更高于xml。
對于configparser,configparser有一個巨大的劣勢,在于配置檔案隻能支援二維,section下定義option(key:value),如果想在option的value中再次定義清單、字典等資料類型,它隻能識别為字元串,你需要将str手動再轉化為對應的資料類型
而針對ymal,json沒有那麼嚴格的格式要求,寫做一行還是換行展示都随你,沒有那麼嚴苛的要求。
最後對比pickle,json格式是各種程式設計語言通用的資料格式,由于是key value的鍵值對,不存在loads之後的安全問題。而且你學會了json,也就學會了pickle,因為二者的使用方式一毛一樣啊!
三分鐘學會Json
1.簡介
JSON(JavaScript Object Notation, JS 對象簡譜) 是一種輕量級的資料交換格式。它基于 ECMAScript (歐洲計算機協會制定的js規範)的一個子集,采用完全獨立于程式設計語言的文本格式來存儲和表示資料。簡潔和清晰的層次結構使得 JSON 成為理想的資料交換語言。易于人閱讀和編寫,同時也易于機器解析和生成,并有效地提升網絡傳輸效率。
至于推薦使用Json的理由:
- Json格式是一種通用的資料類型
- Python内置json子產品,便于操作
- json格式類似于python的dict
- json的儲存與讀取極為友善
- 學習成本低,3分鐘包教包會
2.類型、文法說明
看到上圖的Python與json對比關系,其實差異并不大,我們隻需要注意幾點即可:
- json的資料為key:value,且以逗号分隔,但注意json使用雙引号包裹鍵值對
- 花括号中儲存為對象,而方括号儲存的是數組,不論python是list還是tuple,最終都會轉化為數組
- json由于是js引申的資料類型,是以在布爾表達式與空值上,使用與python不同,需要注意
3.json的方法
- dump():将python對象序列化到一個檔案,是文本檔案,相當于将序列化後的json字元寫到一個檔案
- load():從檔案反序清單出python對象
- json和pickle相同,都隻有四個方法:
- dumps():将python對象編碼為json的字元串
- loads():将字元串編碼為一個python對象
即:帶s的方法是資料類型間的轉化str <--> dict,不帶s的都是資料與檔案的轉化
4.執行個體說明
在示範前,我們需要先定義一個初始化資料:
data = {
"in_use": True,
"info": {
"name_cn": 'Python',
"name_en": "BreezePython",
},
"contents": ["Python", "Java", "Linux"]
}
5.dumps() .loads()
import json
json.dumps(data)
>>> '{"in_use": true, "info": {"name_cn": "\\u6e05\\u98cePython", "name_en": "BreezePython"}, "contents": ["Python", "Java", "Linux"]}'
#Python學習交流QQ群:857662006
#這裡大家看到一個問題,中文異常,此時我們需要添加參數ensure_ascii=False
json.dumps(data,ensure_ascii=False)
>>> '{"in_use": true, "info": {"name_cn": "Python", "name_en": "BreezePython"}, "contents": ["Python", "Java", "Linux"]}'
# 當然我們可以美觀的列印它
json_data = json.dumps(data, sort_keys=True, indent=4, separators=(',', ': '),ensure_ascii=False)
print(json_data)
>>> {
"contents": [
"Python",
"Java",
"Linux"
],
"in_use": true,
"info": {
"name_cn": "Python",
"name_en": "BreezePython"
}
}
# 了解了dumps,loads就比較簡單了...
json.loads(json_data)
{'contents': ['Python', 'Java', 'Linux'], 'in_use': True, 'info': {'name_cn': 'Python', 'name_en': 'BreezePython'}}
6.dump() .load()
import json
# Python學習交流QQ群:857662006
# 先來看看dump将資料儲存至文本
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, indent=4)
# 同理我們還可以使用dumps完成寫入操作
# f.write(json.dumps(data, indent=4))
# 儲存了文本,我們在通過load讀取出來
with open('data.json', 'r', encoding='utf-8') as f:
data = json.load(f)
# 同理我們還可以使用loads完成讀取操作
# data = json.loads(f.read())
print(data)
>>> {'in_use': True, 'info': {'name_cn': 'Python', 'name_en': 'BreezePython'}, 'contents': ['Python', 'Java', 'Linux']}
看到這裡,你是否發現,即便不會dump和load我們一樣可以使用dumps和loads替換前兩者,完成讀寫操作。三分鐘學會了json的操作,并且買一送一附帶學會了pickle的操作。你是否get到?