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__ == '模块的名字'

猜你喜欢

转载自blog.csdn.net/qq_35883464/article/details/83349909