zoukankan      html  css  js  c++  java
  • python模块--序列化

    主要内容:

    1.序列化模块.

    json

    pickle

    shelve(了解)

    序列化模块:

      为了把数据用于网络传输,

      以及文件的读写操作.

        序列化: 将数据转化成序列化字符串.

        反序列化: 将序列化字符串转化成原数据.

    序列化模块:序列化是创造一个序列.

    如何把一个字典传给其他人,依赖之前的知识也可以做到,参考如下:

    dic = {"a":123,"b":456}
    s = str(dic)
    p = eval(s)
    print(p,type(p))
    print(p["a"])

    因为eval可能存在安全性问题,所有不建议用eval.这里就要用到json了.

    json:

    优点:
      # 适用于不同语言之间的,
      # 但是可支持的数据类型:字符串,数字,列表,字典 bool。

    pickle:

    优点:

      只用于python语言之间的.

      可支持python所有的数据类型.

      shelve(了解):只是python,小工具(文件方面).

    # json:
    # 数据通过网络发送给别人. json
    # 写入文件 也用到json.

    序列化过程:一个数据类型---->序列化的字符串

    反序列化过程:序列化的字符串 ---> 它所对应的数据类型.

    json有两对方法:

    dumps loads

    dump load

    # 被json序列化的字符串:
    #1,可以直接通过网络互相传输.
    #2,可以在各个语言中通用.

    示例:

    import json
    dic ={"教室":"python","办公室":"老师"}
    s = json.dumps(dic)
    print(s)
    p = json.loads(s)
    print(p)

    这里需要注意的是json.dump和json.load的问题

    json.load只能读取一次jsondump写的内容,如果json.dump对一个文件写了两次,就会报错.如下:

    import json
    dic = {"a":123,"b":"老师"}
    with open("1.txt",mode="w",encoding="utf-8") as f :
        json.dump(dic,f)
        json.dump(dic, f)
    
    with open("1.txt", mode="r", encoding="utf-8") as f:
        s = json.load(f)
        print(s)

    如何修正这个问题呢?可以用json.dumps来解决.

    如下:

    import json
    dic = {"a":123,"b":"老师"}
    with open("1.txt",mode="w",encoding="utf-8") as f :
        s = json.dumps(dic)
        f.write(s+"
    ")
        f.write(s + "
    ")
        f.write(s + "
    ")
        f.write(s + "
    ")
        f.write(s + "
    ")
        f.write(s + "
    ")
        f.write(s + "
    ")
        f.write(s + "
    ")
    
    
    
    with open("1.txt", mode="r", encoding="utf-8") as f:
        for line in f:
            s = json.loads(line)
            print(s)

     其他参数:

    示例:

    import json
    data = {'username':['李华','二愣子'],'sex':'male','age':16,'A':666}
    json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=('|','*'),ensure_ascii=False)
    print(json_dic2)

    这里面要注意的是:

    sort_keys 是指按key来排序,字母是按照ASCII码来排序的
    indent 是指打印出来后往左偏移的量
    separators 是指字典中的:和,用什么来替换.
    ensure_ascii=False 显示中文

    pickle 序列化模块

    python语言网络交互使用的,他支持所有的python数据类型.

    这个和json一样有两对方法
    dumps和loads,dump和load
    dumps和loads方法和json没有太大的区别,
    示例:
    import pickle
    tu1 = (1,2,4)
    s = pickle.dumps(tu1)
    p = pickle.loads(s)
    print(p)
    
    

    但是dump和load是有区别的.而且还比较大

    pickle.dump()可以多几次写入文件,而且pickle也可以通过pickle.load来获取,但是

    pickle.load一次只能获取一次,所以可以通过异常处理来解决

    示例:

    import pickle
    tu1 = (1,2,4)
    with open("1.txt",mode="wb") as f:
        s = pickle.dump(tu1,f)
        s = pickle.dump(tu1,f)
        s = pickle.dump(tu1,f)
        s = pickle.dump(tu1,f)
        s = pickle.dump(tu1,f)
    with open("1.txt",mode="rb") as f :
        while 1 :
            try :
                p = pickle.load(f)
                print(p)
            except  EOFError:
                break



  • 相关阅读:
    ocilib(简介2)
    C++ Socket编程步骤 (转载)
    服务端和客户端的疑问
    var和public的区别
    vs2010如何设置能实现输入关键字的时候自动提示呢?
    ocilib(简介)
    iostream.h , iostream
    error C2110: cannot add two pointers
    Array 越界不报错的问题
    char* + int or char or ...
  • 原文地址:https://www.cnblogs.com/ahliucong/p/9270092.html
Copyright © 2011-2022 走看看