zoukankan      html  css  js  c++  java
  • 内置模块(一)——序列化模块:json、pickle、shelve

    一、序列化模块

      1、什么是序列化呢?

        序列化的本质就是:将一种数据结构(如字典、列表)等转换成一个特殊的序列(字符串或者bytes)的过程就叫做序列化。

        特别注意:特殊的序列,而不是我们常用的str这种字符串。

      2、序列化的作用

        如果你写入文件中的字符串是一个序列化后的特殊的字符串,那么当你从文件中读取出来,是可以转化回原数据结构的。

      3、小小总结:

        序列化模块就是:将一个常见的数据结构转化成一个特殊的序列,并且这个特殊的序列还可以反解回去。它的主要用途:文件读写数据,网络传输数据。

    二、python中的三种序列化模块的分类

      1、json模块(重要)

        不同语言都遵循的一种数据转化格式,即不同语言都使用的特殊字符串。

        json序列化只支持部分Python数据结构:dict,list, tuple,str,int, float,True,False,None

      2、pickle模块

        只能是Python语言遵循的一种数据转化格式,只能在python语言中使用。

        支持Python所有的数据类型包括实例化对象。

      3、shelve模块

        类似于字典的操作方式去操作特殊的字符串

    三、json模块的用法

      json模块是将满足条件的数据结构转化成特殊的字符串,并且也可以反序列化还原回去。

      序列化模块总共只有两种用法,要不就是用于网络传输的中间环节,要不就是文件存储的中间环节,所以json模块总共就有两对四个方法:

           用于网络传输:dumps、loads

           用于文件写读:dump、load

      dumps、loads

     1 import json
     2 dic = {'k1':'v1','k2':'v2','k3':'v3'}
     3 str_dic = json.dumps(dic)  #序列化:将一个字典转换成一个字符串
     4 print(type(str_dic),str_dic)  #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"}
     5 #注意,json转换完的字符串类型的字典中的字符串是由""表示的
     6  7 dic2 = json.loads(str_dic)  #反序列化:将一个字符串格式的字典转换成一个字典
     8 #注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
     9 print(type(dic2),dic2)  #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
    10 11 12 list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}]
    13 str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型 
    14 print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
    15 list_dic2 = json.loads(str_dic)
    16 print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]

    dump、load

    import json
    f = open('json_file.json','w')
    dic = {'k1':'v1','k2':'v2','k3':'v3'}
    json.dump(dic,f)  #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
    f.close()
    # json文件也是文件,就是专门存储json字符串的文件。
    f = open('json_file.json')
    dic2 = json.load(f)  #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
    f.close()
    print(type(dic2),dic2)

    其他参数说明:

    ensure_ascii:当它为True的时候,所有非ASCII码字符显示为uXXXX序列,只需在dump时将ensure_ascii设置为False即可,此时存入json的中文即可正常显示。

    separators:分隔符,这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开。

    sort_keys:将数据根据keys的值进行排序。 

    四、pickle模块

      pickle模块是将Python所有的数据结构以及对象等转化成bytes类型,然后还可以反序列化还原回去

        刚才也跟大家提到了pickle模块,pickle模块是只能Python语言识别的序列化模块。如果把序列化模块比喻成全世界公认的一种交流语言,也就是标准的话,json就是像是英语,全世界(python,java,php,C,等等)都遵循这个标准。而pickle就是中文,只有中国人(python)作为第一交流语言。

           既然只是Python语言使用,那么它支持Python所有的数据类型包括后面我们要讲的实例化对象等,它能将这些所有的数据结构序列化成特殊的bytes,然后还可以反序列化还原。使用上与json几乎差不多,也是两对四个方法。

        用于网络传输:dumps、loads

           用于文件写读:dump、load

        dumps、loads   

    import pickle
    dic = {'k1':'v1','k2':'v2','k3':'v3'}
    str_dic = pickle.dumps(dic)
    print(str_dic)  # bytes类型
    ​
    dic2 = pickle.loads(str_dic)
    print(dic2)    #字典

        dump、load

    dic = {(1,2):'oldboy',1:True,'set':{1,2,3}}
    f = open('pick序列化',mode='wb')
    pickle.dump(dic,f)
    f.close()
    with open('pick序列化',mode='wb') as f1:
        pickle.dump(dic,f1)

      pickle存储多条数据到同一个文件中

    dic1 = {'name':'oldboy1'}
    dic2 = {'name':'oldboy2'}
    dic3 = {'name':'oldboy3'}
    ​
    f = open('pick多数据',mode='wb')
    pickle.dump(dic1,f)
    pickle.dump(dic2,f)
    pickle.dump(dic3,f)
    f.close()
    ​
    f = open('pick多数据',mode='rb')
    while True:
        try:
            print(pickle.load(f))
        except EOFError:
            break
    f.close()

    五、os模块

      os模块是与操作系统交互的一个接口,它提供的功能多与工作目录,路径,文件等相关。

      目录指的是:文件夹

      当前目录、工作目录、父级目录:指的都是一个,就是本文件所在的文件夹。    

    当前执行这个python文件的工作目录相关的工作路径
    os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径  ** 
    os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd  **
    os.curdir  返回当前目录: ('.')  **
    os.pardir  获取当前目录的父目录字符串名:('..') **# 和文件夹相关 
    os.makedirs('dirname1/dirname2')    可生成多层递归目录  ***
    os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 ***
    os.mkdir('dirname')    生成单级目录;相当于shell中mkdir dirname ***
    os.rmdir('dirname')    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname ***
    # os.listdir('dirname')    列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 **
    # 和文件相关
    os.remove()  删除一个文件  ***
    os.rename("oldname","newname")  重命名文件/目录  ***
    os.stat('path/filename')  获取文件/目录信息 **# 和操作系统差异相关
    # os.sep    输出操作系统特定的路径分隔符,win下为"\",Linux下为"/" *
    # os.linesep    输出当前平台使用的行终止符,win下为"	
    ",Linux下为"
    " *
    # os.pathsep    输出用于分割文件路径的字符串 win下为;,Linux下为: *
    # os.name    输出字符串指示当前使用平台。win->'nt'; Linux->'posix' *
    # 和执行系统命令相关
    # os.system("bash command")  运行shell命令,直接显示  **
    # os.popen("bash command).read()  运行shell命令,获取执行结果  **
    os.environ  获取系统环境变量  **#path系列,和路径相关
    os.path.abspath(path) 返回path规范化的绝对路径  ***
    os.path.split(path) 将path分割成目录和文件名二元组返回 ***
    os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素  **
    os.path.basename(path) 返回path最后的文件名。如何path以/或结尾,那么就会返回空值,即os.path.split(path)的第二个元素。 **
    os.path.exists(path)  如果path存在,返回True;如果path不存在,返回False  ***
    os.path.isabs(path)  如果path是绝对路径,返回True  **
    os.path.isfile(path)  如果path是一个存在的文件,返回True。否则返回False  ***
    os.path.isdir(path)  如果path是一个存在的目录,则返回True。否则返回False  ***
    os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 ***
    os.path.getatime(path)  返回path所指向的文件或者目录的最后访问时间  **
    os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间  **
    os.path.getsize(path) 返回path的大小 ***

    六、sys模块

      sys模块是与python解释器交互的一个接口 

    sys.argv           命令行参数List,第一个元素是程序本身路径
    sys.exit(n)        退出程序,正常退出时exit(0),错误退出sys.exit(1)
    sys.version        获取Python解释程序的版本信息
    sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值  ***
    sys.platform       返回操作系统平台名称
  • 相关阅读:
    深入浅出了解OCR识别票据原理(Applying OCR Technology for Receipt Recognition)
    OCR技术浅探:基于深度学习和语言模型的印刷文字OCR系统
    Python 3.6.4 / win10 使用pip安装keras时遇到依赖的PyYAML安装出错
    简单http代理服务器搭建
    Socket之心跳包实现思路
    设计模式之访问者模式
    设计模式之责任链模式
    设计模式之策略者模式
    C#将.spl剥离成.emf文件格式
    设计模式之状态者模式
  • 原文地址:https://www.cnblogs.com/youhongliang/p/12232236.html
Copyright © 2011-2022 走看看