1. 程式人生 > >python學習day20 序列化模組 模組的匯入

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 *就這能匯入列表中規定的兩個名字