1. 程式人生 > >Python全棧學習筆記day 20:序列化模組、模組的匯入

Python全棧學習筆記day 20:序列化模組、模組的匯入

 

一、序列化模組

從資料型別 --> 字串的過程 :序列化
從字串 --> 資料型別的過程 :反序列化

 json  
    # 通用的序列化格式
    # 只有很少的一部分資料型別(數字、字串、列表、字典、元組)能夠通過json轉化成字串
 pickle
    # 所有的python中的資料型別都可以轉化成字串形式
    # pickle序列化的內容只有python能理解
    # 且部分反序列化依賴python程式碼
 shelve
    # 序列化控制代碼
    # 使用控制代碼直接操作,非常方便

1.1  json

dumps序列化方法 
loads反序列化方法
dump方法接收一個檔案控制代碼,直接將字典轉換成json字串寫入檔案 load方法接收一個檔案控制代碼,直接將檔案中的json字串轉換成資料結構返回
dic = {1:"a",2:'b'}
print(type(dic),dic)             <class 'dict'> {1: 'a', 2: 'b'}
import json
str_d = json.dumps(dic)          序列化
print(type(str_d),str_d)         <class 'str'> {"1": "a", "2": "b"}

dic_d = json.loads(str_d)        反序列化
print(type(dic_d),dic_d)         <class 'dict'> {'1': 'a', '2': 'b'}
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)

       ensure_ascii關鍵字引數(當ensure_ascii是預設值時(預設true)檔案中顯示中文是bytes型別,為引數false時,才正常顯示

import json
dic = {1:"中國",2:'b'}
f = open('fff','w',encoding='utf-8')
json.dump(dic,f)

此時fff檔案中顯示:{"1": "\u4e2d\u56fd", "2": "b"}

import json
dic = {1:"中國",2:'b'}
f = open('fff','w',encoding='utf-8')
json.dump(dic,f,ensure_ascii=False)

此時fff檔案中顯示:{"1": "中國", "2": "b"}

如果想一行行寫,一行行讀,程式碼如下:

l = [{'k':'111'},{'k2':'111'},{'k3':'111'}]
f = open('file','w')
import json
for dic in l:
    str_dic = json.dumps(dic)
    f.write(str_dic+'\n')
f.close()

f = open('file')
import json
l = []
for line in f:
    dic = json.loads(line.strip())
    l.append(dic)
f.close()
print(l)

1.2   pickle

pickle模組提供了四個功能:dumps(序列化)、dump(序列化,存)、loads(反序列化,讀)、load  (不僅可以序列化字典,列表...可以把python中任意的資料型別序列化

import pickle
dic = {'k1':'v1','k2':'v2','k3':'v3'}
str_dic = pickle.dumps(dic)
print(str_dic)  #序列化後是一串二進位制內容:

b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01X\x02\x00\x00\x00v1q\x02X\x02\x00\x00\x00k2q\x03X\x02\x00\x00\x00v2q\x04X\x02\x00\x00\x00k3q\x05X\x02\x00\x00\x00v3q\x06u.'

dic2 = pickle.loads(str_dic)
print(dic2)    #反序列化後是字典:

{'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}

由於是bytes型別,檔案操作要用:wb、rb

import time
struct_time  = time.localtime(1000000000)
print(struct_time)
f = open('pickle_file','wb')
pickle.dump(struct_time,f)
f.close()

f = open('pickle_file','rb')
struct_time2 = pickle.load(f)
print(struct_time2.tm_year)

1.3  shelve         (Python3新加入)

import shelve
f = shelve.open('shelve_file')
f['key'] = {'int':10, 'float':9.5, 'string':'Sample data'}          直接對檔案控制代碼操作,就可以存入資料
f.close()

import shelve
f1 = shelve.open('shelve_file')
existing = f1['key']                  取出資料的時候也只需要直接用key獲取即可,但是如果key不存在會報錯
f1.close()
print(existing)

以上3個:json、pickle、shelve。只有json寫檔案,我們可以看得懂檔案中的東西,其他的檔案中顯示不是bytes型別就是亂碼

二、模組匯入

tips:1、先從sys.modules裡檢視是否已經被匯入
      2、如果沒有被匯入,就依據sys.path路徑取尋找模組
書寫順序:
內建模組
擴充套件的模組      django
自定義的模組

匯入方式:

1、import:
  1.1  import 模組名
         模組名.變數名 和本檔案中的變數名完全不衝突
  1.2  import 模組名 as 重新命名的模組名 : 提高程式碼的相容性
  1.3  import 模組1,模組2
2、from import
   2.1 from 模組名 import 變數名
        直接使用 變數名 就可以完成操作
        如果本檔案中有相同的變數名會發生衝突
   2.2 from 模組名 import 變數名字 as 重新命名變數名
   2.3 from 模組名 import 變數名1,變數名2
   2.4 from 模組名 import *
        將模組中的所有變數名都放到記憶體中
        如果本檔案中有相同的變數名會發生衝突
   2.5 from 模組名 import * 和 __all__ 是一對
        沒有這個變數,就會匯入所有的名字
        如果有all 只匯入all列表中的名字
最後:
__name__  方法
在模組中 有一個變數__name__,
當我們直接執行這個模組的時候,__name__ == '__main__'
當我們執行其他模組,在其他模組中引用這個模組的時候,這個模組中的__name__ == '模組的名字'