<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python3 pickle 與 Json 庫(kù)學(xué)習(xí)「附視頻」

          共 5158字,需瀏覽 11分鐘

           ·

          2021-08-26 00:02

          閱讀本文大概需要6分鐘

          你好,我是悅創(chuàng)。


          最近在想如何把爬蟲(chóng)基礎(chǔ),聯(lián)合起來(lái)形成大規(guī)模的爬蟲(chóng)實(shí)戰(zhàn),在實(shí)戰(zhàn)的時(shí)候用到了 pickle 這就引出了這篇文章。當(dāng)然,這篇文章很早之前就寫(xiě)了。這回的運(yùn)營(yíng)策略,就像這篇文章:關(guān)于「AI悅創(chuàng)」公眾號(hào)運(yùn)營(yíng)的一些思考和調(diào)整 的一樣,來(lái)點(diǎn)不一樣。


          我也爭(zhēng)取把每篇文章的視頻錄出來(lái),如果你不想看文章,可以看視頻教程噢!文章當(dāng)作筆記即可!


          在開(kāi)始之前,我想來(lái)一句不一樣的:


          為什么人與人之間的差距會(huì)這么大?

          因?yàn)槟芰Σ煌龅降慕Y(jié)果不同。

          但是,世界上沒(méi)有金手指。

          沒(méi)有什么一招制敵,都是千錘百煉。

          那些真正厲害的人,都是每天扎扎實(shí)實(shí)地蹲馬步,練基本功。

          問(wèn)問(wèn)自己:

          一些最基本的事情,做到了沒(méi)有?

          扎實(shí)一點(diǎn),才能走得更遠(yuǎn)一點(diǎn)。

          不正經(jīng)定義

          有些人對(duì)于專業(yè)晦澀難懂的定義,老是無(wú)法專心閱讀。接下來(lái)我就先以一小段簡(jiǎn)短的對(duì)話,讓你來(lái)快速了解 pickle 與 json 庫(kù)的區(qū)別。


          有個(gè)同學(xué),Alex 過(guò)來(lái)問(wèn)悅創(chuàng),說(shuō):json 這個(gè)是干什么用的,和 pickle 有什么區(qū)別?我的回答我覺(jué)得已經(jīng)很通俗易懂了:

          嗯, 我試著這么說(shuō):Python 這個(gè)人呢, 如果出遠(yuǎn)門(mén)的話是需要坐高鐵的(各種數(shù)據(jù)庫(kù)), 后來(lái)他買(mǎi)了輛小破車(pickle)做短途交通用。

          就在近幾年,打車軟件火爆了,滿街跑的都是 “滴滴”(json),于是它下了一個(gè)軟件(json 模塊),需要時(shí)也用下滴滴(json), 后來(lái)就越來(lái)越多的人在用滴滴(json)了。

          不知道,我這個(gè)答復(fù),你覺(jué)得怎么樣呢?


          我就不說(shuō)非常專業(yè)的術(shù)語(yǔ)來(lái),但是你應(yīng)該已經(jīng)知道了,這兩個(gè)庫(kù)的小小關(guān)聯(lián)了。不過(guò)就單單這么講,肯定是不行的,接下來(lái)就正式的來(lái)講一下吧。

          Json 庫(kù)

          我來(lái)講一個(gè)和實(shí)際應(yīng)用很貼近的知識(shí)點(diǎn)。


          JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,它的設(shè)計(jì)意圖是把所有事情都用設(shè)計(jì)的字符串來(lái)表示,這樣既方便在互聯(lián)網(wǎng)上傳遞信息,也方便人進(jìn)行閱讀(相比一些 binary 的協(xié)議)。JSON 在當(dāng)今互聯(lián)網(wǎng)中應(yīng)用非常廣泛,也是每一個(gè)用 Python 程序員應(yīng)當(dāng)熟練掌握的技能點(diǎn)。


          設(shè)想一個(gè)情景,你要向交易所購(gòu)買(mǎi)一定數(shù)額的股票。那么,你需要提交股票代碼、方向(買(mǎi)入 / 賣出)、訂單類型(市價(jià) / 限價(jià))、價(jià)格(如果是限價(jià)單)、數(shù)量等一系列參數(shù),而這些數(shù)據(jù)里,有字符串,有整數(shù),有浮點(diǎn)數(shù),甚至還有布爾型變量,全部混在一起并不方便交易所解包。


          那該怎么辦呢?


          其實(shí),我們要講的 JSON ,正能解決這個(gè)場(chǎng)景。你可以把它簡(jiǎn)單地理解為兩種黑箱:

          • 第一種,輸入這些雜七雜八的信息,比如 Python 字典,輸出一個(gè)字符串;
          • 第二種,輸入這個(gè)字符串,可以輸出包含原始信息的 Python 字典。

          具體代碼如下:

          import json

          params = {
          'symbol': '123456',
          'type': 'limit',
          'price': 123.4,
          'amount': 23
          }

          params_str = json.dumps(params)

          print('after json serialization')
          print('type of params_str = {}, params_str = {}'.format(type(params_str), params))

          original_params = json.loads(params_str)

          print('after json deserialization')
          print('type of original_params = {}, original_params = {}'.format(type(original_params), original_params))

          ########## 輸出 ##########

          after json serialization
          type of params_str = <class 'str'>, params_str = {'symbol': '123456', 'type': 'limit', 'price': 123.4, 'amount': 23}
          after json deserialization
          type of original_params = <class 'dict'>, original_params = {'symbol': '123456', 'type': 'limit', 'price': 123.4, 'amount': 23}

          代碼內(nèi)操作:dumps、loads

          image.png

          是不是很簡(jiǎn)單呢?

          不過(guò)還是那句話,請(qǐng)記得加上錯(cuò)誤處理。不然,哪怕只是給 json.loads() 發(fā)送了一個(gè)非法字符串,而你沒(méi)有 catch 到,程序就會(huì)崩潰了?!概e個(gè)例子:類似,你的用戶在注冊(cè)的時(shí)候,傳入了一個(gè)非法的字符串(可以理解為:不符合你設(shè)定的規(guī)則或者程序無(wú)法識(shí)別的(顏表情)等)這個(gè)時(shí)候你的程序就直接奔潰停止運(yùn)行么?顯然是不行的)

          到這一步,你可能會(huì)想,如果我要輸出字符串到文件,或者從文件中讀取 JSON 字符串,又該怎么辦呢?

          是的,你仍然可以使用之前提到的 open() read()/write() ,先將字符串讀取 / 輸出到內(nèi)存,再進(jìn)行 JSON 編碼 / 解碼,當(dāng)然這有點(diǎn)麻煩。Python 中的文件基本操作合集 with open~

          import json

          params = {
          'symbol': '123456',
          'type': 'limit',
          'price': 123.4,
          'amount': 23
          }

          with open('params.json', 'w') as fout:
          params_str = json.dump(params, fout)

          with open('params.json', 'r') as fin:
          original_params = json.load(fin)

          print('after json deserialization')
          print('type of original_params = {}, original_params = {}'.format(type(original_params), original_params))

          ########## 輸出 ##########

          after json deserialization
          type of original_params = <class 'dict'>, original_params = {'symbol': '123456', 'type': 'limit', 'price': 123.4, 'amount': 23}

          文件流操作:dump、load

          這樣,我們就簡(jiǎn)單清晰地實(shí)現(xiàn)了讀寫(xiě) JSON 字符串的過(guò)程。當(dāng)開(kāi)發(fā)一個(gè)第三方應(yīng)用程序時(shí),你可以通過(guò) JSON 將用戶的個(gè)人配置輸出到文件,方便下次程序啟動(dòng)時(shí)自動(dòng)讀取。這也是現(xiàn)在普遍運(yùn)用的成熟做法。

          那么 JSON 是唯一的選擇嗎? 顯然不是,它只是輕量級(jí)應(yīng)用中最方便的選擇之一。據(jù)我所知,在 Google,有類似的工具叫做 Protocol Buffer,當(dāng)然,Google 已經(jīng)完全開(kāi)源了這個(gè)工具,你可以自己了解一下使用方法。

          相比于 JSON,它的優(yōu)點(diǎn)是生成優(yōu)化后的二進(jìn)制文件,因此性能更好。但與此同時(shí),生成的二進(jìn)制序列,是不能直接閱讀的。它在 TensorFlow 等很多對(duì)性能有要求的系統(tǒng)中都有廣泛的應(yīng)用。

          說(shuō)完 Json 之后,我們就要來(lái)說(shuō)說(shuō) pickle 了。

          Pickle 庫(kù)

          接下來(lái),會(huì)講到序列化和反序列化,所以我先分享一下這兩個(gè)的定義。模塊 Pickle 實(shí)現(xiàn)了對(duì)一個(gè)  Python 對(duì)象結(jié)構(gòu)的二進(jìn)制的序列化和反序列化。

          • 我們把變量從內(nèi)存中變成可存儲(chǔ)或傳輸?shù)倪^(guò)程稱之為序列化,序列化之后,就可以把序列化后的內(nèi)容寫(xiě)入磁盤(pán),或者通過(guò)網(wǎng)絡(luò)傳輸?shù)絼e的機(jī)器上。
          • 反過(guò)來(lái),把變量?jī)?nèi)容從序列化的對(duì)象重新讀到內(nèi)存里稱之為反序列化,即 unpickling。

          即當(dāng) Python 程序持續(xù)運(yùn)行一些字符串、列表字典、甚至自定義的類等數(shù)據(jù)對(duì)象,需要 持久化存儲(chǔ),即存儲(chǔ)在磁盤(pán)中,防止運(yùn)行在內(nèi)存中,因斷電等情況丟失數(shù)據(jù)。

          那么 Pickle 模塊就派上用場(chǎng)了,它可以將對(duì)象轉(zhuǎn)換為一種可以傳輸或存儲(chǔ)的格式。Python 的 pickle 模塊實(shí)現(xiàn)了基本的數(shù)據(jù)序列和反序列化。通過(guò) pickle 模塊的序列化操作我們能夠?qū)⒊绦蛑羞\(yùn)行的對(duì)象信息保存到文件中去,永久存儲(chǔ);通過(guò) pickle 模塊的反序列化操作,我們能夠從文件中創(chuàng)建上一次程序保存的對(duì)象。

          與 JSON 模塊的比較

          可以看到 pickle 模塊和看似相似,但其還是有著本質(zhì)的不同,即:

          • JSON 是一個(gè)文本序列化格式(它輸出 unicode 文本,盡管在大多數(shù)時(shí)候它會(huì)接著以 utf-8 編碼),而 pickle 是一個(gè)二進(jìn)制序列化格式;
          • JSON 是字面量可讀的,而 pickle 不是(可以類比 base64 的不可讀性);
          • JSON 是可互操作的,在 Python 系統(tǒng)之外廣泛使用,而 pickle 則是 Python 專用的;

          序列化與反序列化

          通過(guò)二進(jìn)制的方式讀寫(xiě)目標(biāo)存儲(chǔ)文件,并利用 dump 序列化數(shù)據(jù)對(duì)象,load 反序列化數(shù)據(jù)對(duì)象:

          import pickle

          D = {
          'name': 'bob',
          'major': {
          'english',
          'math'
          },
          'd': [1, 2, 3, 4, 5, 6, 7]
          }

          with open('D.pik', 'wb') as f:
          pickle.dump(D, f)

          with open('D.pik', 'rb') as f:
          D = pickle.load(f)
          print(type(D))
          print(D)

          示例結(jié)果:

          <class 'dict'>
          {'name':
          'bob', 'major': {'english', 'math'}, 'd': [1, 2, 3, 4, 5, 6, 7]}

          當(dāng)然我們也可以序列化到內(nèi)存(字符串格式保存),然后對(duì)象可以以任何方式處理如通過(guò)網(wǎng)絡(luò)傳輸:

          pik = pickle.dumps(D)
          print(pik)

          D = pickle.loads(pik)
          print(type(D))
          print(D)

          示例結(jié)果:

          b'\x80\x04\x95E\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x03bob\x94\x8c\x05major\x94\x8f\x94(\x8c\x07english\x94\x8c\x04math\x94\x90\x8c\x01d\x94]\x94(K\x01K\x02K\x03K\x04K\x05K\x06K\x07eu.'
          <class 'dict'>
          {'name':
          'bob', 'major': {'english', 'math'}, 'd': [1, 2, 3, 4, 5, 6, 7]}

          cPickle

          cPickle 包的功能和用法與 pickle 包幾乎完全相同 (其存在差別的地方實(shí)際上很少用到),不同在于 cPickle 是基于 c 語(yǔ)言編寫(xiě)的,具有更好的性能,對(duì)于大多數(shù)應(yīng)用程序,推薦使用該模塊。對(duì)于上面的例子,如果想使用 cPickle 包,我們都可以將 import 語(yǔ)句改為 import cPickle as pickle 進(jìn)行使用。

          AI悅創(chuàng)·推出輔導(dǎo)班啦,包括「Python 語(yǔ)言輔導(dǎo)班、C++輔導(dǎo)班、算法/數(shù)據(jù)結(jié)構(gòu)輔導(dǎo)班、少兒編程(scratch)、pygame 游戲開(kāi)發(fā)」,全部都是一對(duì)一教學(xué):一對(duì)一輔導(dǎo) + 一對(duì)一答疑 + 布置作業(yè) + 項(xiàng)目實(shí)踐等。QQ、微信在線,隨時(shí)響應(yīng)!V:Jiabcdefh

          點(diǎn)個(gè)在看、點(diǎn)個(gè)贊、分享一下吧!謝謝!

          感謝大家支持,F(xiàn)ighting!

          作者:AI悅創(chuàng)
          排版:AI悅創(chuàng)





          黃家寶丨AI悅創(chuàng)

          隱形字

          攝影公眾號(hào)「悅創(chuàng)攝影研習(xí)社」


          在這里分享自己的一些經(jīng)驗(yàn)、想法和見(jiàn)解。


          長(zhǎng)按識(shí)別二維碼關(guān)注




          好文和朋友一起看~
          瀏覽 33
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  人人看天天操 | 恋屌毛片 | 亚洲第一香蕉视频在线观看 | 无码中文字幕在线观看 | 在线观看免费成人网站 |