zoukankan      html  css  js  c++  java
  • Json & pickle 数据序列化

    前提:

    文本文件中只能写入字符串或ascii码格式的内容。

    info={'name':'zoe','age':18}
    f=open('test.txt','w')
    f.write(info)  #在文本文件中写入字典格式的内容,执行会报错。
    f.closed()

    变通方式将 f.write(info) 改为 f.write(str(info))。

    但是这种写法比较低端。

    同时,将文件通过open()读取到环境中,读取进来的还是字符串格式的。上面的操作是序列化,读取文件后的操作时反序列化。

    f=open('test.txt','r')
    data=f.read()
    print(type(data))   #返回class 'str'
    #想要保留数据的原本的格式,还需要将数据转化。
    data_new=eval(data)
    print(type(data_new))
    print(data_new)

    返回:

     但是上面的序列化和反序列化的方式不是常规的用法。只是在我们不了解序列化模块json,pickle的时候的用法。接下来我们介绍用于序列化的两个模块。

    用于序列化的两个模块

    • json,用于字符串 和 python数据类型间进行转换
    • pickle,用于python特有的类型 和 python的数据类型间进行转换

    Json模块提供了四个功能:dumps、dump、loads、load

    pickle模块提供了四个功能:dumps、dump、loads、load

    json

    实例1:

    import json
    info={'name':'zoe','age':18}
    f=open('test.txt','w')
    f.write(json.dumps(info))  #序列化。将info转换为字符串,写入文本文件中
    f.close()
    import json
    f=open('test.txt','r')
    data=json.loads(f.read())   #反序列化。用loads方法将字符串
    print(data(type))
    f.close()

    实例2:

    >>> import json
    >>> def sayhi(name):
        print('hello,',name)
        
    >>> info={'name':'zoe','age':18,'func':sayhi}
    >>> f=open('test.txt','w')
    
    >>> f.write(json.dumps(info))   #函数sayhi的内存地址不是json可以序列化的参数。
    Traceback (most recent call last):
      File "<pyshell#12>", line 1, in <module>
        f.write(json.dumps(info))
      File "C:UsersoeAnaconda3libjson\__init__.py", line 230, in dumps
        return _default_encoder.encode(obj)
      File "C:UsersoeAnaconda3libjsonencoder.py", line 198, in encode
        chunks = self.iterencode(o, _one_shot=True)
      File "C:UsersoeAnaconda3libjsonencoder.py", line 256, in iterencode
        return _iterencode(o, 0)
      File "C:UsersoeAnaconda3libjsonencoder.py", line 179, in default
        raise TypeError(repr(o) + " is not JSON serializable")
    TypeError: <function sayhi at 0x000000000317F8C8> is not JSON serializable

    所以,json只能支持简单的数据类型,如字典,列表,字符串等。——

    json主要用于不同的语言之间进行数据交互。比方说java和python之间的字典的交互,类,函数等复杂的json是无法进行处理,在不同语言之间进行交互。

    xml主要在不同的语言和程序之间进行数据交互,是一种标记式的语言,正在逐渐被json给取代。因为json更简洁,更清晰。json是目前主流的在不同语言之间进行数据交互的模块。

    json只能处理简单的,而pickle是用来处理复杂的数据类型。

    json和pickle的操作和json一模一样。

    pickle

     实例1:

    import pickle
    def sayhi(name):
        print('hello,',name)
    
    info={'name':'zoe','age':18,'func':sayhi}
    f=open('test.txt','wb')  #以二进制方式写入文件
    f.write(pickle.dumps(info))   #pickle.dump(info,f)完全等价
    f.close()

    反序列化:

    import pickle
    def sayhi(name):
        print('hello world',name)
    
    f=open('test.txt','rb')
    a=pickle.loads(f.read())  #完全等价于pickle.load(f)
    print(a)
    a['func']('zoe')   
    '''如果反序列化中程序中没有sayhi()函数,则会报错。然而,在程序中有定义的同名的sayhi()函数即可读取并调用。
    两个程序之间的内存地址是不能互相访问的,所以在函数序列化中,
    pickle只能在python中使用。'''

    小知识:

    json和pickle在文件写入过程中dumps两次,会写入两次;

    json和pickle在文件中loads,在3.x中只能loads一次。

    在2.x中第一次dump的,可以第一次loads。但是这个不好。

    所以对于同一个文件的写入和读取记住只dump一次,load一次。如果想要每个都要dump一次,则dump成不同的文件。

  • 相关阅读:
    android--从手动存取->View Model->Live Data->Data Binding
    android--------解决Entities and POJOs must have a usable public constructor
    开课第一周周总结
    Pandas Series: sum()方法
    .Net Core/Framework之Nginx反向代理后获取客户端IP等数据探索
    readonly与disabled的区别
    html使用frame框架导航跳转至指定的节的用法
    HTML+Css让网页自动适应电脑手机屏幕
    仿Quora的免费问答网站程序
    WebGL 纹理颜色原理
  • 原文地址:https://www.cnblogs.com/zoe233/p/7091119.html
Copyright © 2011-2022 走看看