• python模块使用(序列化、随机数、os、sys、hashlib)


    模块:

    1.json,pickle,shelve

    2.random

    3.os

    4.sys

    5.hashlib

    1.json,pickle,shelve

    序列化:

    把内存数据转成字符串或字节,叫作序列化
    
    把字符串或字节转成内存里的数据类型,叫作反序列化

    序列化的目的:

      1.将数据永久保存
    
      2.用于网络传输
    
      3.使程序更具维护性

    数据类型转成字符串存到内存的意义: json.dumps及json.loads

    1.把内存的数据,通过网络传输共享给远程其他人,因为网络传输是1010的大串数字
    2.定义了不同语言之间的交互规则
    
     交互规则: 
        1.纯文本,坏处是不能共享复杂的数据类型(比如字典)
        2.xml,坏处是占空间大
        3.json,简单可读性好

    json和pickle的区别:

    1.支持的数据类型:
        json:str,int,tuple,list,dict
        pickle:支持所有的数据类型
    
    2.pickle只能在python中使用,而json可以跨平台
    
    3.pickle支持序列化函数
    
    4.json转成的是str类型,pickle转成的是bytes类型

    json模块的用法:

    dumps(value)        # 把数据转换成字符串
    
    loads(str_value)     # 把字符串转换成原来的类型
    
    dump(value, file)    # 把数据转成字符串写入文件中
    
    load(file)    # 把数据从文件读入内存转换成原来的类型

    使用:

    import json
    
    # json主要用于字典和列表转换成字符串,不同语言之间可以相互传输数据
    d = {'1':2,'2':3,'3':4}
    
    # dumps 把数据转换成字符串,要用于网络传输需要先encode
    str_d = json.dumps(d)
    print(str_d,type(str_d))
    # {"1": 2, "2": 3, "3": 4} <class 'str'>
    
    # loads 把字符串转成该数据类型
    dic = json.loads(str_d)
    print(dic,type(dic))
    # {'1': 2, '2': 3, '3': 4} <class 'dict'>
    
    # dump 把数据写入文件
    json.dump(d,open('data.json','w',encoding='utf-8'))
    
    # load 把文件里的数据读取到dic
    dic = json.load(open('data.json','r',encoding='utf-8'))
    print(dic,type(dic))
    # {'1': 2, '2': 3, '3': 4} <class 'dict'>
    View Code

    注:json写入文件是w模式,因为是字符串,如果要写wb模式,需要再把json的字符串类型转成bytes类型

    # ensure_ascii=False 不编码
    # indet=2 可视化输出(加换行 + 缩进(2个空格))
    json.dump(self.data, f, ensure_ascii=False, indent=2)

    pickle模块的用法:

    和json一样,但是转成的数据类型不同,pickle直接转成bytes类型。

    使用:

    import pickle
    
    # pickle只用于python之前传输数据,可以各种数据类型
    d = {'1':2,'2':3,'3':4}
    
    # dumps 把数据转成bytes类型,可以直接用于网络传输
    byte_d = pickle.dumps(d)
    print(byte_d)
    #b'\x80\x03}q\x00(X\x01\x00\x00\x001q\x01K\x02X\x01\x00\x00\x002q\x02K\x03X\x01\x00\x00\x003q\x03K\x04u.'
    
    # loads 把bytes类型数据转成原有类型
    dic = pickle.loads(byte_d)
    print(dic)
    
    # dump 把数据写入文件以二进制形式打开文件写入
    pickle.dump(d,open('data.pkl','wb'))
    
    # load 把数据从文件以二进制模式导出内容,dic接收内容
    dic = pickle.load(open('data.pkl','rb'))
    print(dic)
    View Code

    注:pickle写入文件时候需要是wb模式

    shelve模块:

    对pickle进行的封装,python独有,作用是可存多个变量内容不会乱,key:value的存储形式。

    用法:

    f = shelve.open(filename)    # 首先打开文件
    
    字典的各种操作。
    
    f.close()   # 用完关闭文件

    使用:

    import shelve
    
    # 创建文件,写入内容,会生成3份.bak 、 .data和.dir文件
    f = shelve.open('data.shl')
    f['name'] = 'zezhou'
    f['age'] = 19
    f.close()
    
    # 读取文件数据
    f = shelve.open('data.shl')
    for key in f:
        print(key,f[key])
    f.close()
    """
    name zezhou
    age 19
    """
    View Code

    2.random

     取随机值的模块,也可以打乱列表顺序。

    用法:

    random.random()                  #  取0-1的随机小数
    
    random.uniform(start,end)        #  取start-end的随机小数
    
    random.randint(start,end)        # 取start-end区间包括头尾的整数
    
    random.randrange(start,end,step) # 取start-end+步长的整数,例可以取一个随机奇数
    
    random.choice(iterable)          # 取一个可迭代对象的随机的一个数,注可迭代对象必须支持索引
    
    random.choices(iterable,k=1)     # 随机取一个或多个指定列表的元素,k默认为1表示取一个,取多个会有重复,注可迭代对象必须支持索引
    
    random.sample(iterable,k=num)    # 随机取一个或多个指定列表的元素,k必须指定如k=2表示取二个,去多个没有重复,注可迭代对象必须支持索引
    
    random.shuffle(iterable)         # 打乱一个可迭代对象的排列,注可迭代对象必须支持索引

    使用:

    import random
    
    # 获得一个0-1的随机小数
    a = random.random()
    print(a)
    # 0.6788278582812177
    
    # 获得一个指定区间的随机小数
    a = random.uniform(1,5)
    print(a)
    # 2.1725147621792904
    
    # 获得一个1-10(包括1和10)随机的整数
    a = random.randint(1,10)
    print(a)
    # 8
    
    # 获得一个1-10的随机奇数
    a = random.randrange(1,10,2)
    print(a)
    # 7
    
    # 获得指定列表的随机的一个元素
    a = random.choice(['wzz','zz','111'])
    print(a)
    # 'zz'
    # print(random.choice({1,2,3,4}))   # 不能放没有索引的数据类型
    
    # k可以指定返回几个随机内容,会有重复,默认k=1
    a = random.choices(['wzz','zz','111'])
    print(a)
    # ['wzz']
    
    # k指定返回几个随机内容,不会有重复,必须有k参数
    a = random.sample(['wzz','zz','111','222'],k=2)
    print(a)
    # ['zz', '111']
    
    # shuffle 可以打乱列表顺序,必须支持索引
    lis = [i for i in range(1,11)]
    # lis = {1,2,3,4}
    random.shuffle(lis)
    print(lis)
    # [3, 10, 8, 6, 2, 1, 7, 9, 5, 4]

    3.os

    针对操作系统的。

    注:需要先导入improt os

     对文件的操作:

    # remove 删除文件,找不到会报错FileNotFoundError
    os.remove('test.txt')
    
    # rename 修改文件名称
    os.mkdir('test')
    os.rename('test','123')
    
    # listdir 获取路径下的内容,默认不写是以python执行当前路径
    print(os.listdir())
    # ['day13作业.py', 'register', 'test.py', '内置函数.py', '装饰器']
    
    # stat 返回文件或文件夹的信息
    print(os.stat('os模块.py'))
    # os.stat_result(st_mode=33206, st_ino=14918173765665585, st_dev=2728164148, \
    # st_nlink=1, st_uid=0, st_gid=0, st_size=1599, st_atime=1552986929, \
    # st_mtime=1552986929, st_ctime=1552986929)
    
    # 获取单个值,文件的大小
    print(os.stat('os模块.py').st_size)
    View Code

    对文件夹的操作:

    # mkdir 创建文件夹,存在报错FileExistsError
    os.mkdir('ttt')
    
    # rmdir 删除文件夹,找不到报错FileNotFoundError
    os.rmdir('ttt')
    
    # makedirs 递归创建文件夹,存在FileExistsError
    os.makedirs(r'test\1\2\3\4')
    
    # removedirs 递归删除文件夹,存在文件或文件夹报错OSError
    os.removedirs(r'test\1\2\3\4')
    View Code

    运行系统命令:

    # system 运行系统命令
    os.system('shutdown -s -t 100')
    # shutdown -a 解除
    
    # 中文会乱码
    os.system('ping 127.0.0.1')
    
    # popen 运行系统命令,不会显示乱码
    data = os.popen('ipconfig')
    print(data.read())
    data.close()
    View Code

    系统相关的操作:

    # name 打印当前使用平台
    print(os.name)
    # windows为‘nt’,Linux为‘postix’
    
    # environ 返回系统所有的环境变量
    print(os.environ)
    # 字典形式显示
    
    # getenv 返回环境变量该key的value
    print(os.getenv('USERNAME'))
    # Administrator
    
    # linesep 返回当前平台的换行符
    print(repr(os.linesep))
    # '\r\n'  
    # windows为’\r\n’,linux为’\n’
    View Code

    路径的操作:

    # getcwd获取当前工作路径
    print(os.getcwd())
    # F:\PyCharm\python project\python20\day14
    
    # chdir 切换路径
    os.chdir(r'..\day13')
    print(os.getcwd())
    # F:\PyCharm\python project\python20\day13
    
    # path.join 路径拼接
    print(os.path.join('D:\\','123','456'))
    # D:\123\456
    
    # 返回文件的绝对路径
    print(os.path.abspath('test.py'))
    # F:\PyCharm\python project\python20\day14\test.py
    
    # 返回文件路径,去掉一层路径
    print(os.path.dirname(r'F:\PyCharm\python project\python20\day14\test.py'))
    # F:\PyCharm\python project\python20\day14
    
    path = r'F:\PyCharm\python project\python20\day14\test.py'
    print(os.path.dirname(os.path.dirname(path)))
    # F:\PyCharm\python project\python20
    
    # path.getsize 获取文件大小,用的其实是stat的st_size
    print(os.path.getsize('random模块.py'))
    # 1029
    
    # path.split 以最后一个路径分割符切割成一个元祖
    print(os.path.split(os.path.join(os.getcwd(),'test.py')))
    # ('F:\\PyCharm\\python project\\python20\\day14', 'test.py')
    
    # 返回文件名
    print(os.path.basename(r'F:\PyCharm\python project\python20\day14\test.py'))
    # test.py
    View Code

    判断操作:

    # path.exists 判断文件是否存在
    print(os.path.exists('123'))
    # False
    
    # path.isfile 判断是否是文件
    print(os.path.isfile('day14'))
    # False
    
    # path.isdir 判断是否是文件夹
    os.mkdir('test')
    print(os.path.isdir('test'))
    # True
    View Code

    # 删除非空文件夹

    import shutil
    shutil.rmtree(目录路径)

    4.sys

     针对python解释器的。

    操作:

    import sys
    
    # 可以将cmd用户输入的内容传到文件内使用
    print(sys.argv)
    """
    F:\PyCharm\python project\python20\day14>python sys模块.py ip=127.0.0.1 port=8000
    ['sys模块.py', 'ip=127.0.0.1', 'port=8000']
    """
    
    # 退出的状态码,默认为0(表示正常退出)
    sys.exit(8)
    # Process finished with exit code 8
    
    # 返回python解释器版本
    print(sys.version)
    # 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)]
    
    # 返回python的环境变量,如果要自定义模块需要添加路径否则找不到
    print(sys.path)
    # 返回一个列表形式
    
    # 返回操作系统平台名称
    print(sys.platform)
    # win32
    
    # 标准输出
    sys.stdout.write('zezhou')
    # zezhou
    
    # 标准输入,readline 一行
    data = sys.stdin.readline()
    print(data)
    # hello world!
    # hello world!
    
    # 获取最大递归层数,默认1000,实际998、997
    print(sys.getrecursionlimit())
    # 1000
    
    # 设置最大递归层数
    sys.setrecursionlimit(1100)
    print(sys.getrecursionlimit())
    # 1100
    
    # 获取解释器默认编码,python3默认是utf-8
    print(sys.getdefaultencoding())
    # utf-8
    
    # 获取内存数据存入文件的默认编码
    print(sys.getfilesystemencoding())
    # utf-8
    View Code

    5.hashlib

      摘要算法通常应用于网站存储用户的帐号密码相关信息。默认情况下,我们插入到数据库的帐号密码都是以明文保存。这样的话,一旦数据库泄露,所有用户的口令都会直接泄露,而且明文保存,网站管理员也可以直接查看到用户口令,这样及不安全。所以我们可以在获取到用户输入的密码以后,直接对其进行加密处理。然后将加密的字符串存入数据库。这样当下次用户登录时,再对用户输入的密码进行加密处理,然后与数据库中存储的加密字串进行比对,如果匹配,则说明密码正确。

    加密算法:

      1.md5

      2.sha1

      3.sha256

      4.sha512

    作用:

      1.加密后当作用户密码 

      2.判断文件一致性(文件有一点变动hash值都不同) 

    通常会加“盐”使其更安全:  # “盐”可以是用户名

    import hashlib
    
    # md5值是唯一的,不可逆(现在已经可以破解了。)
    username = 'zezhou'
    password = 'qwer123'
    md5 = hashlib.md5(username.encode('utf-8'))  # 选择加密方式,加"盐",需要先转换成bytes类型
    md5.update(password.encode('utf-8'))   # 将明文转成bytes类型再转换成密文
    print(md5.hexdigest())     # 生成密文
    # 547115b1db23d54c8cd93e2e8dd26cd3

    sha1算法:  # 比md5更安全一点,更长点

    import hashlib
    
    sha1 = hashlib.sha1()
    sha1.update('123456'.encode('utf-8'))
    print(sha1.hexdigest())
    # 7c4a8d09ca3762af61e59520943dc26494f8941b
  • 相关阅读:
    序号正确
    基于visual Studio2013解决C语言竞赛题之1071打印工资
    基于visual Studio2013解决C语言竞赛题之1070删除相同节点
    基于visual Studio2013解决C语言竞赛题之1069链表查找删除
    基于visual Studio2013解决C语言竞赛题之1068指针数组
    基于visual Studio2013解决C语言竞赛题之1067间隔排序
    基于visual Studio2013解决C语言竞赛题之1066进制转化
    基于visual Studio2013解决C语言竞赛题之1065二维排序
    基于visual Studio2013解决C语言竞赛题之1064互质数差1验证
    基于visual Studio2013解决C语言竞赛题之1063分橘子
  • 原文地址:https://www.cnblogs.com/zezhou/p/10559459.html
Copyright © 2020-2023  润新知