zoukankan      html  css  js  c++  java
  • day15 json,os,sys,hashlib

     序列化模块

    import json
    # json 序列化模块 是所有语言通用的一种标准(数据转化格式)。
    # str int bool dict list(tuple) None

    import pickle
    # pickle 序列化模块 只是支持python语言之间的互相传输。
    # python语言的所有数据类型 对象 都可以进行网络传递
    # 写入文件时 可以写入多个。

    import shelve # 了解
    # shelve 序列化模块 只是支持python语言,与文件相关。
    # 第一对方法:dumps loads  与网络传输相关
    dic = {'name': "太白金星", 'hobby_list': ['戒烟', '烫不了头', '戒酒']}
    print(dic)
    s = json.dumps(dic,ensure_ascii=False)  # 序列化过程
    print(s,type(s))
    dic1 = json.loads(s)  # 反序列化过程
    print(dic1, type(dic1))
    dumps loads
    # 第二对 dump load 与文件相关
    dic = {'name': "太白金星", 'hobby_list': ['戒烟', '烫不了头', '戒酒']}
    with open('序列化.json', encoding='utf-8', mode='w') as f1:
        json.dump(dic, f1, ensure_ascii=False)
    
    with open('序列化.json', encoding='utf-8',) as f2:
        ret = json.load(f2)
    print(ret, type(ret))
    dump load
    # 参数讲解:
    dic = {'name': "太白金星",
           'hobby_list': ['戒烟', '烫不了头', '戒酒'],
           'age': 18,
           'money': '1个亿'}
    print(dic)
    s = json.dumps(dic,ensure_ascii=False,sort_keys=True,separators=('|',','))  # 序列化过程
    # sort_keys 按键排序
    # ensure_ascii=False 显示中文
    # separators=('|',',') 设置分隔符 没有意义
    参数讲解

    json 和 bytes的区别

    bytes 只能操作str,用于网路传输

    json 可操作 str , int,bool,dict,list,(tuple),None用于网路传输,文件存储

    用json将多个字典写入一个文件

    # 如果用dump load 一个文件只能写入一个数据结构
    dic1 = {'name': '春哥'}
    dic2 = {'name': '子伍'}
    dic3 = {'name': '王子'}
    with open('多个字典.json',encoding='utf-8',mode='w') as f1:
        f1.write(json.dumps(dic1, ensure_ascii=False) + '
    ')
        f1.write(json.dumps(dic2, ensure_ascii=False) + '
    ')
        f1.write(json.dumps(dic3, ensure_ascii=False))
    
    with open('多个字典.json',encoding='utf-8',mode='r') as f1:
        for line in f1:
            print(json.loads(line))
        ret1 = json.loads(f1.read())
        ret2 = json.loads(f1.read())
        ret3 = json.loads(f1.read())
    print(ret1, ret2, ret3)
    View Code

    总结:  

      dumps  loads用于网络传输和多个数据写入文件

      dump  load 只能用于一个数据结构写入文件

    注意:

    # 坑:
    dic = {1: 'alex'}  # 如果键是数字,自动转字符串
    ret = json.dumps(dic)
    print(ret)
    print(json.loads(ret))

    import  pickle

     dumps loads 用于网络传输 :将数据结构 ----> 转化成bytes

    dic = {'name': "太白金星",
           'hobby_list': ['戒烟', '烫不了头', '戒酒'],
           'age': 18,
           'money': '1个亿'}
    s1 = pickle.dumps(dic)
    print(s1)   # 是bytes字符显示,不能显示任何其他类型
    dic2 = pickle.loads(s1)
    print(dic2)
    dic = {'name': "太白金星",
           'hobby_list': ['戒烟', '烫不了头', '戒酒'],
           'age': 18,
           'money': '1个亿'}
    with open('p1.pickle',mode='wb') as f1:  # wb: bytes形式
        pickle.dump(dic, f1)   #  操作文件用dump
    with open('p1.pickle',mode='rb') as f1:
        dic1 = pickle.load(f1)  # 注意要用load
        print(dic1)
    dump, load
    利用dump,load写多个字典到文件
    # 利用dump load 将多个数据写入文件
    dic1 = {'name': '春哥'}
    dic2 = {'name': '子伍'}
    dic3 = {'name': '王子'}
    with open('p2.pickle',mode='wb') as f1:
        pickle.dump(dic1, f1)
        pickle.dump(dic2, f1)
        pickle.dump(dic3, f1)
    with open('p2.pickle', mode='rb') as f2:
        print(pickle.load(f2))
        print(pickle.load(f2))
        print(pickle.load(f2))
    dump写多个文件
    def func():
        print(666)
    
    with open('p3.pickle',mode='wb') as f1:
        pickle.dump(func,f1)   #函数名写入文件
    
    with open('p3.pickle',mode='rb') as f1:
        ret = pickle.load(f1)
    ret()   # ret() == func()
    View Code

    json 和 pickle
    这里我们要说明一下,json是一种所有的语言都可以识别的数据结构。
    如果我们将一个字典或者序列化成了一个json存在文件里,那么java代码或者js代码也可以拿来用。
    但是如果我们用pickle进行序列化,其他语言就不能读懂这是什么了~
    所以,如果你序列化的内容是列表或者字典,我们非常推荐你使用json模块
    但如果出于某种原因你不得不序列化其他的数据类型,而未来你还会用python对这个数据进行反序列化的话,那么就可以使用pickle

    import  shelve  # 了解

    # shelve序列化模块,只是支持python语言,与文件相关

    import shelve
    f = shelve.open('shelve_file')
    f['key'] = {'int':10, 'float':9.5, 'string':'Sample data'}  #直接对文件句柄操作,就可以存入数据
    f.close()
    # 给文件写入一个字典:{'key':{'int':10, 'float':9.5, 'string':'Sample data'}}
    
    f = shelve.open('shelve_file')
    print(f['key'])
    f.close()
    
    import shelve
    f1 = shelve.open('shelve_file',writeback=True)
    print(f1['key'])
    f1['key']['new_value'] = 'this was not here before'
    f1.close()
    
    f1 = shelve.open('shelve_file')
    print(f1['key'])
    f1.close()
    # writeback=True 如果相对shelve文件进行修改,必须要添加这个参数
    View Code

    import  hashlib

    给密码加密

    文件的校验

    hashlib:将str类型,通过算法 -----> 一串等长度的数字

    1、不同的字符串,转化成数字肯定不同

    2、相同的字符串即使在不同的计算机上只要使用相同的加密方式,转化的数字一定相同

    3、hashlib加密不可逆,不能破解

    MD5

    普通版,容易破解

    import hashlib
    ret = hashlib.md5()
    ret.update('123'.encode('utf-8'))
    print(ret.hexdigest())  # 202cb962ac59075b964b07152d234b70

    静态加盐版:

    import hashlib
    ret = hashlib.md5('verygood'.encode('utf-8'))  #
    #  加盐,给每一个密码添加verygood后,在计算md5码
    ret.update('123456'.encode('utf-8'))
    print(ret.hexdigest())

    动态加盐:

    import hashlib
    username = input('用户名: ')
    ret = hashlib.md5(username[::2].encode('utf-8'))  #
    #  动态加盐,给每一个密码添加切片后的用户名,在计算md5码
    ret.update('123456'.encode('utf-8'))
    print(ret.hexdigest())
    md5 加密效率快,通用,安全性相对差
    sha系列,算法更好 安全性高,效率低,耗时长
    import hashlib
    # ret = hashlib.sha1()
    # ret.update('gjfds;gfjdgfkdg;lfdkg;fdlgk;fldgk;fldg'.encode('utf-8'))
    # print(ret.hexdigest())
    #
    #
    # ret = hashlib.sha512()
    # ret.update('gjfds;gfjdgfkdg;lfdkg;fdlgk;fldgk;fldg'.encode('utf-8'))
    # print(ret.hexdigest())
    sha加密

    文件的校验

    小文件校验

    import hashlib
    def check_md5(file):
        ret = hashlib.md5()
        with open(file, mode='rb') as f1:
            ret.update(f1.read())   #  读全文
            return ret.hexdigest()
    print(check_md5('文件校验1'))
    print(check_md5('文件校验2'))
    小文件校验

    大文件校验

    import hashlib
    def check_md5(file):
        ret = hashlib.md5()
        with open(file, mode='rb') as f1:
            while 1:
                count = f1.read(1024)  # 每次读1204个字节
                if count:   # 文件最后一次读为空,count为False 走else
                    ret.update(count)
                else:
                    break
            return ret.hexdigest()
    print(check_md5('文件校验1'))
    print(check_md5('文件校验2'))
    View Code

    os模块:

    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的大小
    View Code

    SYS模块

    sys.argv           命令行参数List,第一个元素是程序本身路径
    sys.exit(n)        退出程序,正常退出时exit(0),错误退出sys.exit(1)
    sys.version        获取Python解释程序的版本信息
    sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
    sys.platform       返回操作系统平台名称
    import sys
    try:
        sys.exit('意外中断....')
    except SystemExit as e:
        print(e)
    异常处理

    collections模块

    1.namedtuple: 生成可以使用名字来访问元素内容的tuple

    2.deque: 双端队列,可以快速的从另外一侧追加和推出对象

    from collections import deque
    q = deque(['a','b','c'])
    print(q)
    # 从右边增加值
    q.append('x')
    q.append('y')
    # 从右边删除值
    q.pop()
    q.pop()
    # 从左边增值
    q.appendleft('x')
    q.appendleft('y')
    # 从左边删除
    q.popleft()
    q.popleft()
    print(q)
    View Code

    3.Counter: 计数器,主要用来计数

    from collections import Counter
    # s1 = '电脑电脑sldfjslffdsaf'
    s1 = ['电脑','电脑','电脑','电脑','']
    c = Counter(s1)
    print(c)
    print(dict(c))  # {'电脑': 4, '书': 1}
    View Code

    4.OrderedDict: 有序字典

    5.defaultdict: 带有默认值的字典

     

  • 相关阅读:
    Daemon Tools手工完全卸载方案
    不要轻易删除/windows/install下文件
    Dumpbin命令的使用
    v4l2 视频捕获
    2瓶4两酒,1个1.5两的酒杯
    n个平面分空间最多可分成多少份
    &#65279导致页面顶部空白一行解决方法
    Base64编码原理分析
    浏览器中“JavaScript解析器”工作原理
    IList转化为DataSet,解决了System.nullable()的问题
  • 原文地址:https://www.cnblogs.com/echo2019/p/10243775.html
Copyright © 2011-2022 走看看