天天看點

Python的小資料存儲,用什麼格式更有逼格?

小資料存儲

我們在編寫代碼的時候,經常會涉及到資料存儲的情況,如果是爬蟲得到的大資料,我們會選擇使用資料庫,或者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的理由:

  1. Json格式是一種通用的資料類型
  2. Python内置json子產品,便于操作
  3. json格式類似于python的dict
  4. json的儲存與讀取極為友善
  5. 學習成本低,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到?