zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    NYOJ 625 笨蛋的难题(二)
    NYOJ 102 次方求模
    ZJU Least Common Multiple
    ZJUOJ 1073 Round and Round We Go
    NYOJ 709 异形卵
    HDU 1279 验证角谷猜想
    BNUOJ 1015 信息战(一)——加密程序
    HDU 1202 The calculation of GPA
    "蓝桥杯“基础练习:字母图形
    "蓝桥杯“基础练习:数列特征
  • 原文地址:https://www.cnblogs.com/zezhou/p/10559459.html
Copyright © 2011-2022 走看看