python學習day20 序列化模組 模組的匯入
http://www.cnblogs.com/Eva-J/articles/7228075.html#_label9
序列化模組
為什麼要序列化?
資料儲存
網路上傳輸的時候
從資料型別 --> 字串的過程 序列化
從字串 --> 資料型別的過程 反序列化
json --通用的序列化格式
通用的序列化格式
只有很少的一部分資料型別能夠通過json轉化成字串
pickle
所有的python中的資料型別都可以轉化成字串形式
pickle序列化的內容只有python能理解
且部分反序列化依賴python程式碼
shelve
比較新
序列化控制代碼
使用控制代碼直接操作,非常方便
json
數字 字串 列表 字典 元組
dumps -- 序列化
loads --- 反序列化
直接在記憶體中執行
import json dic = {1:"a",2:'b'} print(type(dic),dic) str_d = json.dumps(dic) # 序列化 print(type(str_d),str_d) # str {"k": "v1"} 雙引號 # '{"kkk":"v"}' dic_d = json.loads(str_d) # 反序列化 print(type(dic_d),dic_d) # 元組序列化後變成列表字元化,反序列化後還是列表# 集合不能序列化
dump load
可以寫入檔案
import json f = open('json_file','w') dic = {'k1':'v1','k2':'v2','k3':'v3'} json.dump(dic,f) #dump方法接收一個檔案控制代碼,直接將字典轉換成json字串寫入檔案 f.close() f = open('json_file') dic2 = json.load(f) #load方法接收一個檔案控制代碼,直接將檔案中的json字串轉換成資料結構返回 f.close() print(type(dic2),dic2)
import json f = open('file','w') json.dump({'國籍':'中國'},f) ret = json.dumps({'國籍':'中國'}) f.write(ret+'\n') json.dump({'國籍':'美國'},f,ensure_ascii=False) # json中的是漢字 不加的話會是bytes編碼 ret = json.dumps({'國籍':'美國'},ensure_ascii=False) f.write(ret+'\n') f.close()
模組
模組匯入順序:
內建模組
擴充套件的 比如django
自定義的
模組級別函式定義的執行將函式名放入模組全域性名稱空間表,用globals()可以檢視
為了防止重複匯入,python的優化手段是:第一次匯入後就將模組名載入到記憶體了,後續的import語句僅是對已經載入大記憶體中的模組物件增加了一次引用,不會重新執行模組內的語句。
定義一個模組:
#my_module.py print('from the my_module.py') money=1000 def read1(): print('my_module->read1->money',money) def read2(): print('my_module->read2 calling read1') read1() def change(): global money money=0
我們可以從sys.modules中找到當前已經載入的模組,sys.modules是一個字典,內部包含模組名與模組物件的對映,該字典決定了匯入模組時是否需要重新匯入。
先從sys.modules裡檢視是否已經被匯入
如果沒有被匯入,就依據sys.path路徑取尋找模組
找到了就匯入
建立這個模組的名稱空間
執行檔案,把檔案中的名字都放到名稱空間裡
#demo.py import my_module #只在第一次匯入時才執行my_module.py內程式碼,此處的顯式效果是隻列印一次'from the my_module.py',當然其他的頂級程式碼也都被執行了,只不過沒有顯示效果. import my_module import my_module import my_module ''' 執行結果: from the my_module.py '''
每個模組都是一個獨立的名稱空間,定義在這個模組中的函式,把這個模組的名稱空間當做全域性名稱空間,這樣我們在編寫自己的模組時,就不用擔心我們定義在自己模組中全域性變數會在被匯入時,與使用者的全域性變數衝突
- 使用import demo匯入模組,會建立一個獨立的名稱空間,裡面的所有函式都被匯入進來,再定義一個和demo中函式名一樣的函式,就無效
- 使用from...import...匯入,再定義一個和demo中函式名一樣的函式,匯入的函式就被覆蓋
from my_module import * 把my_module中所有的不是以下劃線(_)開頭的名字都匯入到當前位置,大部分情況下我們的python程式不應該使用這種匯入方式,因為*你不知道你匯入什麼名字,很有可能會覆蓋掉你之前已經定義的名字。而且可讀性極其的差,在互動式環境中匯入時沒有問題。
在my_module.py中新增一行
__all__=['money','read1'] #這樣在另外一個檔案中用from my_module import *就這能匯入列表中規定的兩個名字