標籤:asc log ges 方式 列表 bsp erro 寫法 closed
前提:
文字檔中只能寫入字串或ascii碼格式的內容。
info={‘name‘:‘zoe‘,‘age‘:18}f=open(‘test.txt‘,‘w‘)f.write(info) #在文字檔中寫入字典格式的內容,執行會報錯。f.closed()
變通方式將 f.write(info) 改為 f.write(str(info))。
但是這種寫法比較低端。
同時,將檔案通過open()讀取到環境中,讀取進來的還是字串格式的。上面的操作是序列化,讀取檔案後的操作時還原序列化。
f=open(‘test.txt‘,‘r‘)data=f.read()print(type(data)) #返回class ‘str‘#想要保留資料的原本的格式,還需要將資料轉化。data_new=eval(data)print(type(data_new))print(data_new)
返回:
但是上面的序列化和還原序列化的方式不是常規的用法。只是在我們不瞭解序列化模組json,pickle的時候的用法。接下來我們介紹用於序列化的兩個模組。
用於序列化的兩個模組
- json,用於字串 和 python資料類型間進行轉換
- pickle,用於python特有的類型 和 python的資料類型間進行轉換
Json模組提供了四個功能:dumps、dump、loads、load
pickle模組提供了四個功能:dumps、dump、loads、load
json
執行個體1:
import jsoninfo={‘name‘:‘zoe‘,‘age‘:18}f=open(‘test.txt‘,‘w‘)f.write(json.dumps(info)) #序列化。將info轉換為字串,寫入文字檔中f.close()
import jsonf=open(‘test.txt‘,‘r‘)data=json.loads(f.read()) #還原序列化。用loads方法將字串print(data(type))f.close()
執行個體2:
>>> import json>>> def sayhi(name): print(‘hello,‘,name) >>> info={‘name‘:‘zoe‘,‘age‘:18,‘func‘:sayhi}>>> f=open(‘test.txt‘,‘w‘)>>> f.write(json.dumps(info)) #函數sayhi的記憶體位址不是json可以序列化的參數。Traceback (most recent call last): File "<pyshell#12>", line 1, in <module> f.write(json.dumps(info)) File "C:\Users\Zoe\Anaconda3\lib\json\__init__.py", line 230, in dumps return _default_encoder.encode(obj) File "C:\Users\Zoe\Anaconda3\lib\json\encoder.py", line 198, in encode chunks = self.iterencode(o, _one_shot=True) File "C:\Users\Zoe\Anaconda3\lib\json\encoder.py", line 256, in iterencode return _iterencode(o, 0) File "C:\Users\Zoe\Anaconda3\lib\json\encoder.py", line 179, in default raise TypeError(repr(o) + " is not JSON serializable")TypeError: <function sayhi at 0x000000000317F8C8> is not JSON serializable
所以,json只能支援簡單的資料類型,如字典,列表,字串等。——
json主要用於不同的語言之間進行資料互動。比方說java和python之間的字典的互動,類,函數等複雜的json是無法進行處理,在不同語言之間進行互動。
xml主要在不同的語言和程式之間進行資料互動,是一種標記式的語言,正在逐漸被json給取代。因為json更簡潔,更清晰。json是目前主流的在不同語言之間進行資料互動的模組。
json只能處理簡單的,而pickle是用來處理複雜的資料類型。
json和pickle的操作和json一模一樣。
pickle
執行個體1:
import pickledef sayhi(name): print(‘hello,‘,name)info={‘name‘:‘zoe‘,‘age‘:18,‘func‘:sayhi}f=open(‘test.txt‘,‘wb‘) #以二進位方式寫入檔案f.write(pickle.dumps(info)) #pickle.dump(info,f)完全等價f.close()
還原序列化:
import pickledef sayhi(name): print(‘hello world‘,name)f=open(‘test.txt‘,‘rb‘)a=pickle.loads(f.read()) #完全等價於pickle.load(f)print(a)a[‘func‘](‘zoe‘) ‘‘‘如果還原序列化中程式中沒有sayhi()函數,則會報錯。然而,在程式中有定義的同名的sayhi()函數即可讀取並調用。兩個程式之間的記憶體位址是不能互相訪問的,所以在函數序列化中,pickle只能在python中使用。‘‘‘
小知識:
json和pickle在檔案寫入過程中dumps兩次,會寫入兩次;
json和pickle在檔案中loads,在3.x中只能loads一次。
在2.x中第一次dump的,可以第一次loads。但是這個不好。
所以對於同一個檔案的寫入和讀取記住只dump一次,load一次。如果想要每個都要dump一次,則dump成不同的檔案。
Json & pickle 資料序列化