zoukankan      html  css  js  c++  java
  • Python9-模块2-序列化-day20

    序列化

    什么叫序列化——将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化

    序列就是字符串

    序列化的目的
    1、以某种存储形式使自定义对象持久化;
    2、将对象从一个地方传递到另一个地方。
    3、使程序更具维护性。

    #json模块(*****)
    # 通用的序列化格式
    # 只有很少的一部分数据类型能够通过json转化成字符串

    #pickle模块
    #所有的python中的数据类型都可以转化成字符串形式
    #pickle序列化的内容只有python能理解
    #且部分反序列化依赖代码

    #shelve模块
    #有了序列化句柄
    #使用句柄直接操作
    #json  dumps(序列化方法)  loads (反序列方法)
    #可序列化:数字  字符串 列表 字典 元祖(元祖转化列表序列化)
    # dic = {'k1':'v1'}
    import json
    print(type(dic),dic)
    str_d = json.dumps(dic)   #序列化:将一个字典转换成一个字符串
    print(type(str_d),str_d)
    #注意,json转换完的字符串类型的字典中的字符串是由""表示的
    
    dic_d = json.loads(str_d)  #反序列化:将一个字符串格式的字典转换成一个字典
    #注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
    print(type(str_d),str_d)
    
    # 元祖序列化
    dic = (1,2,3,4)
    print(type(dic),dic)
    str_d = json.dumps(dic)   #序列化:将一个字典转换成一个字符串
    print(type(str_d),str_d)

    <class 'dict'> {'k1': 'v1'}
    <class 'str'> {"k1": "v1"}
    <class 'str'> {"k1": "v1"}

    #json dump load方法--文件相关的操作
    import  json
    dic = {'k1':'v1'}
    f = open('fff','w',encoding='utf-8')
    json.dump(dic,f)   #将字典序列化然后传到文件中
    f.close()
    
    import json
    f =open('fff')
    res = json.load(f)
    f.close()
    print(type(res),res)
    #ensure_ascii=False 参数解决中文问题
    import  json
    dic = {'k1':'中国人','k2':'b'}
    f = open('fff','w',encoding='utf-8')
    json.dump(dic,f,ensure_ascii=False)   #将字典序列化然后传到文件中
    f.close()
    f =open('fff',encoding='utf-8')
    res = json.load(f)
    f.close()
    print(type(res),res)
    
    
    <class 'dict'> {'k2': 'b', 'k1': '中国人'}
    # 一行一行写
    l = [{'k':'111'},{'k':'111'},{'k':'111'}]
    f = open('file','w')
    import  json
    for dic in l:
        str_dic = json.dumps(dic)
        f.write(str_dic+'
    ')
    f.close()
    import  json
    l = []
    f = open('file')
    for line in f:
        dic = json.loads(line.strip())
        l.append(dic)
    f.close()
    print(l)

    pickle模块

    #pickle
    import pickle
    dic = {'k1':'v1','k2':'v2','k3':'v3'}
    str_dic = pickle.dumps(dic)
    print(str_dic)  #一串二进制内容
    
    dic2 = pickle.loads(str_dic)
    print(dic2)    #字典
    
    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)

    b'x80x03}qx00(Xx02x00x00x00k1qx01Xx02x00x00x00v1qx02Xx02x00x00x00k2qx03Xx02x00x00x00v2qx04Xx02x00x00x00k3qx05Xx02x00x00x00v3qx06u.'
    {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}

    #分布dump和load  但是json不行
    import time
    struct_time1  = time.localtime(1000000000)
    struct_time2  = time.localtime(2000000000)
    f = open('pickle_file','wb')
    pickle.dump(struct_time1,f)
    pickle.dump(struct_time2,f)
    f.close()
    
    f = open('pickle_file','rb')
    struct_time1 = pickle.load(f)
    struct_time2 = pickle.load(f)
    print(struct_time1.tm_year)
    print(struct_time2.tm_year)
    f.close()
    
    2001
    2033

     模块导入

    demo
    print('in demo.py')
    money = 100
    def read():
        print('in read1',money)
    
    
    import demo
    money = 200
    demo.read()
    print(demo.money)
    
    # 先从sys.modules里查看是否已经被导入
    # 如果没有被导入,就依据sys.path路径去寻找模块
    # 找到了就导入
    # 创建这个模块的命名空间
    # 执行文件,把文件中的名字放到命名空间里
    in demo.py in read1 10
    #给模块起别名
    import time as t
    print(t.time())
    
    
    # oracle
    # mysql
    if db == 'oracle':
        import oracle as db
    elif db == 'mysql':
        import mysql  as db
    # 连接数据库  db.connect
    #                  db.connect
    # 登录认证
    # 模块导入顺序:先导入内置的,再导入扩展的(别人写好的:django),自定义的模块
    #from ....import...
    from math import pi
    print(pi)
    pi =3
    print(pi)
    
    3.141592653589793
    3

    from ....import *  与__all__配合

    demo
    __all__ = ['money','read']
    print('in demo.py')
    money = 100
    def read():
        print('in read1',money)
    def read2():
        print('in read2')
    
    from demo import *
    print(money)
    read()
    总结:
    所有的模块导入都应该尽量往上写
    遵循内置模块、扩展模块、自定义模块
    模块不会重复被导入:sys.moudles
    #从哪里导入模块:sys.path
    #import
    import 模块名
    模块名.变量名 和本文件中的变量名完全不冲突
    import 模块名 as 重命名的模块名:提高代码的兼容性
    import 模块1,模块2(不推荐)


    #from import
    from 模块名 import 变量名
    直接使用变量名,就可以完成操作
    如果本文件中有相同的变量名会发生冲突
    from 模块名 import 变量名 as 重命名的变量名
    from 模块名 import 变量名1,变量名2
    from 模块名 import *
    将模块中的所有变量名都放到内存中
    from 模块名 import * 和__all__是一对
    没有这个变量就会导入所有的名字
    如果有all只导入al列表中的名字


    包 一大堆模块的集合
    __name__
    在模块中有一个变量__name__
    当我们直接执行这个模块的时候,__name__的值就等于__main__
    当我们执行其他模块。在其他模块中引用这个模块的时候,这个模块中的__name__ == ‘模块的名字’
  • 相关阅读:
    基础数论--例题
    基础数论--扩展欧几里得算法
    基础数论--欧拉定理,逆元
    基础数论--快速幂
    基础数论--欧拉函数
    基础数论--约数
    数论基础--质数
    图算法--二分图的最大匹配(匈牙利算法)
    WEB/APP开发基础之旅--网页布局
    WEB/APP开发基础之旅--HTML入门2
  • 原文地址:https://www.cnblogs.com/zhangtengccie/p/10348131.html
Copyright © 2011-2022 走看看