Python 基礎 json 與pickle


         json 與pickle 是一種序列化的數據格式,在學json與pickle 之前呢,我們是接觸過eval 函數的,這個函數是干嘛用的呢?其實這個函數就是提取字符串中的數據類型的。剛學會之歌方法的時候感覺好牛逼,好牛逼,but,eval方法是有局限性的,對於普通的數據類型,json.loads和eval都能用,但遇到特殊類型的時候,eval就不管用了,所以eval的重點還是通常用來執行一個字符串表達式,並返回表達式的值。

#---轉換類型

d={"name":"yuan"}

s=str(d)

print(type(s))

d2=eval(s)

print(d2[1])

with open("test") as f:

    for i in f :

        if type(eval(i.strip()))==dict:
            print(eval(i.strip())[1])
            
View Code

 

我們把對象(變量)從內存中變成可存儲或傳輸的過程稱之為序列化,在Python中叫pickling,在其他語言中也被稱之為serialization,marshalling,flattening等等,都是一個意思。序列化之后,就可以把序列化后的內容寫入磁盤,或者通過網絡傳輸到別的機器上。反過來,把變量內容從序列化的對象重新讀到內存里稱之為反序列化,即unpickling。

    現在就先介紹一下牛逼的json:

    如果我們要在不同的編程語言之間傳遞對象,就必須把對象序列化為標准格式,比如XML,但更好的方法是序列化為JSON,因為JSON表示出來就是一個字符串,可以被所有語言讀取,也可以方便地存儲到磁盤或者通過網絡傳輸。JSON不僅是標准格式,並且比XML更快,而且可以直接在Web頁面中讀取,非常方便。

    這幾天都是把數據存入和取出文本文件,用json類型的“字符串”進行操作,在這個過程中出現過很多的錯誤,今天就對我之前跳過的坑做一次總結吧!

先看一下json在文本文件中的使用情況,關鍵自己只學了這個呀,

#----------------------------序列化
import json

dic={'name':'alvin','age':23,'sex':'male'}
print(type(dic))#<class 'dict'>

data=json.dumps(dic)
print("type",type(data))#<class 'str'>
print("data",data)


f=open('序列化對象','w')
f.write(data)  #-------------------等價於json.dump(dic,f)
f.close()


#-----------------------------反序列化<br>
import json
f=open('序列化對象')
new_data=json.loads(f.read())#  等價於data=json.load(f)

print(type(new_data))

看起來操作很簡單吧,沒錯他就會給你這種假象,然后你自己操作一下就掉坑里去了!看起來沒啥問題是吧,好我就給你找個問題你看看哈

 

def oo():
    with open('new_hello','r') as f:
        #for i in f:
            data = json.loads(f.read())
            # print(data)
            # ret.append(data)
            return data

res = oo()
print(res)

結果你就會發現:沒錯就是這個錯誤,這個錯誤呢考驗了我整整一天的時間,為啥會報出這個錯誤呢,其實原因有很多種,就我遇到的我可以說一說,

1.從上面的代碼你就會看出我是一次性把文件中的內容加載在內存中,然后就loads打印了,這個當然會報錯了,json是一行行取數據的,你這樣操縱的話,后面一行就會覆蓋前面的一行,這樣一定會出問題的呀!so,你該如何做就不用我多說了吧,只能循環遍歷輸出了,這是解決這一問題的辦法之一,

2.在你存儲文件過程中不能有空行,若是自己往文件中手動存儲字典類型的數據,就要全部使用雙引號,這一點要牢牢記住!!!

在使用json中要注意的問題:

import json
#dct="{'1':111}"#json 不認單引號
#dct=str({"1":111})#報錯,因為生成的數據還是單引號:{'one': 1}

dct='{"1":"111"}'
print(json.loads(dct))

#conclusion:
#        無論數據是怎樣創建的,只要滿足json格式,就可以json.loads出來,不一定非要dumps的數據才能loads

pickle

import pickle
 
dic={'name':'alvin','age':23,'sex':'male'}
 
print(type(dic))#<class 'dict'>
 
j=pickle.dumps(dic)
print(type(j))#<class 'bytes'>
 
 
f=open('序列化對象_pickle','wb')#注意是w是寫入str,wb是寫入bytes,j是'bytes'
f.write(j)  #-------------------等價於pickle.dump(dic,f)
 
f.close()
#-------------------------反序列化
import pickle
f=open('序列化對象_pickle','rb')
 
data=pickle.loads(f.read())#  等價於data=pickle.load(f)
 
 
print(data['age'])

    Pickle的問題和所有其他編程語言特有的序列化問題一樣,就是它只能用於Python,並且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的數據,不能成功地反序列化也沒關系。

最后呢,也對json進行一下總結:

Json簡介:Json,全名 JavaScript Object Notation,是一種輕量級的數據交換格式。Json最廣泛的應用是作為AJAX中web服務器和客戶端的通訊的數據格式。

Encode過程,是把python對象轉換成json對象的一個過程,常用的兩個函數是dumps和dump函數。兩個函數的唯一區別就是dump把python對象轉換成json對象生成一個fp的文件流,而dumps則是生成了一個字符串:

Decode過程,是把json對象轉換成python對象的一個過程,常用的兩個函數是loads和load函數。區別跟dump和dumps是一樣的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM