zoukankan      html  css  js  c++  java
  • 模块—— 序列化模块、random模块、os模块 、 sys模块、hashlib模块、collections模块

    今天我们来说说Python中的模块:

    第三方模块

    可以下载/安装/使用

    第一步:将pip.exe 所在的目录添加到环境变量中
    第二步:输入pip
    第三步:pip install 要安装的模块名称  #pip install xlrd
    报错原因:
    要求更新模块:python36 -m pip install --upgrade pip  
    安装成功不能导入:重启pycharm、重新安装

    自定义模块

      随着程序代码越写越多,不易维护,所以我们把函数分组,放在不同的文件中,这样每个文件的代码块就较少,一个.py文件就是一个自定义模块

    第一种 直接import
    这里有个大前提,就是你的py执行文件和模块同属于同个目录(父级目录),如下图:

    执行文件main.py 模块文件pwcong模块同在python目录
    pwcong模块提供的函数写在 __init__.py 里,里面只提供一个 hi 函数:
    def hi():
    print("hi")
    执行文件main.py直接import自定义模块

    import pwcong
    pwcong.hi()
    第二种 通过sys模块导入

    如果执行文件和模块不在同一个目录下,这时用import是找不到自定义模块的

    import sys
    sys.path.append(r"C:UsersPwcongDesktoppython")
    import pwcong
    pwcong.hi()
    第三种 通过path文件导入自定义模块

    内置模块

      python内部提供的功能。

    Python中的模块有下面这些:

    一、序列化模块:

    序列化的目的:

    ①:以某种存储形式使自定义对象持久化;

    ②:将对象从一个地方传递到另一个地方;

    ③:使程序更具维护性。

    json模块:

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

    首先我们来说说dumps和loads:

       dumps:将JSON格式的编码内容序列化成字符串格式的

    源码:
    json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
    1 obj: 表示是要序列化的对象。
     2 
     3 fp: 文件描述符,将序列化的str保存到文件中。json模块总是生成str对象,而不是字节对象;因此,fp.write()必须支持str输入。
     4 
     5 skipkeys: 默认为False,如果skipkeysTrue,(默认值:False),则将跳过不是基本类型(str,int,float,bool,None)的dict键,不会引发TypeError。
     6 
     7 ensure_ascii: 默认值为True,能将所有传入的非ASCII字符转义输出。如果ensure_ascii为False,则这些字符将按原样输出。
     8 
     9 check_circular:默认值为True,如果check_circular为False,则将跳过对容器类型的循环引用检查,循环引用将导致OverflowError。
    10 
    11 allow_nan: 默认值为True,如果allow_nan为False,则严格遵守JSON规范,序列化超出范围的浮点值(nan,inf,-inf)会引发ValueError。 如果allow_nan为True,则将使用它们的JavaScript等效项(NaN,Infinity,-Infinity)。
    12 
    13 indent: 设置缩进格式,默认值为None,选择的是最紧凑的表示。如果indent是非负整数或字符串,那么JSON数组元素和对象成员将使用该缩进级别进行输入;indent为0,负数或“”仅插入换行符;indent使用正整数缩进多个空格;如果indent是一个字符串(例如“	”),则该字符串用于缩进每个级别。
    14 
    15 separators: 去除分隔符后面的空格,默认值为None,如果指定,则分隔符应为(item_separator,key_separator)元组。如果缩进为None,则默认为(’,’,’:’);要获得最紧凑的JSON表示,可以指定(’,’,’:’)以消除空格。
    16 
    17 default: 默认值为None,如果指定,则default应该是为无法以其他方式序列化的对象调用的函数。它应返回对象的JSON可编码版本或引发TypeError。如果未指定,则引发TypeError。
    18 
    19 sort_keys: 默认值为False,如果sort_keys为True,则字典的输出将按键值排序。

    例子:

    1 import  json
    2 dic = {"name":"tom","age":23}
    3 str_dic = json.dumps(dic)    序列化 将一个字典转换成一个字符串
    4 print(type(str_dic),str_dic)

    json转换完的字符串类型的字典中的字符串是由""表示的

       

    1 import json
    2 # 序列化,将python的值转换为json格式的字符串。
    3 v = [12,3,4,{'k1':'v1'},True,'asdf']
    4 print(v,type(v))
    5 v1 = json.dumps(v)
    6 print(v1,type(v1))  #[12, 3, 4, {"k1": "v1"}, true, "asdf"]

      loads:  将json格式的字符串转换成python的数据类型

    1 dic2 = json.loads(str_dic)  #反序列化:将一个字符串格式的字典转换成一个字典
    2  
    3 print(type(dic2),dic2)  #<class 'dict'> 
    4 
    5 #注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
    1 v2 = '["alex",123]'
    2 print(type(v2))       #列表类型的字符串结构
    3 v3 = json.loads(v2)
    4 print(v3,type(v3))  #将JSON类型的编码内容反序列化成为Python的内容
    5 >>> ['alex', 123] <class 'list'>
    6 
    7 v4 = [{1,2,3},True]   #不能是元组类型,只能是集合、列表、字典类型
    8 ret = json.dumps(v4)
    9 print(ret)

    dump 和 load(文件操作相关)

     1 import json
     2 f = open('json_file','w')
     3 dic = {'k1':'v1','k2':'v2','k3':'v3'}
     4 json.dump(dic,f)
     5 f.close()
     6 接收一个文件句柄,直接将字典转换成json字符串写入
     7 
     8 import json
     9 f = open('json_file','r')
    10 dic2 = json.load(f)
    11 f.close()
    12 print(dic2,type(dic2))
    13 接收一个文件句柄,直接将文件中的json字符串转换成字典的数据结构返回
    总结:
    # json.load() #参数文件句柄(r), 将文件中字符串转换成字典
    # json.dump() #对象(字典),文件句柄(w) 将字典转换字符串写入到文件中
    # json.dumps() #对象(字典) 将字典转换成字符串
    # json.loads() #字符串(字典) 将字符串转换成字典

    json的格式化输出
    1 import json
    2 data = {'username':['李华','二愣子'],'sex':'male','age':16}
    3 json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=(',',':'),ensure_ascii=False)
    4 print(json_dic2)

    结果:

    1 {
    2   "age":16,
    3   "sex":"male",
    4   "username":[
    5     "李华",
    6     "二愣子"
    7   ]
    8 }

    pickle模块只用于Python编译器

    不仅可以序列化字典,列表...可以把python中任意的数据类型序列化

    1 import pickle
    2 print(pickle.dumps({'1':4}))   #将对象转换成类似二进制的东西
    3 print(pickle.loads(b'x80x03}qx00Xx01x00x00x001qx01Kx04s.'))
    4 #将一个堆类似于二进制的东西转换成字典
    5 
    6 pickle.dump({'2':4},open('b','wb'))
    7 d = pickle.load(open('b','rb'))
    8 print(d)
    总结:
    josn,pickle 对比:

    loads json里的将字符串转换成字典 pickle 将字节转换成字典
    dumps json里的将字典转换成字符串 pickle 将字典转换成字节
    load json里的将文件中的字符串转换成字典 pickle 将文件中的字节转换成字典
    dump json里的将字典转换字符串写入到文件中,pickle 将字典转换成字节写入到文件中

    shelve模块

    1 import shelve
    2 f = shelve.open('c',writeback=True) #创建文件  # writeback = True 回写
    3 f['name'] = 'alex'
    4 f['age'] = 18
    5 print(f['name'],f['age'])
    7 print(f)  # 这样是查看不了字典
    8 
    9 for i in f:
    10     print(i)   #获取到所有的键
    11
    12 print(f.keys())  #keys也不行
    13 
    14 for i in f:
    15     print(f[i])  #获取到所有的值

    二、random 模块:  随机数模块

    1 获取0-1之间的随机小数
    2 import random
    3 print(random.random())
    1 获取指定范围的随机小数
    2 import random
    3 print(random.uniform(1,5))
    1 获取范围内的随机整数
    2 import random
    3 print(random.randint(1,5))
    4 # 起始位置,终止位置 两头都包含
    1 获取范围内的随机奇数和偶数:
    2 import random
    3 print(random.randrange(1,5,2))   #随机生成1-5的奇数
    4 print(random.randrange(0,5,2))   #随机生成0-5的偶数
    5 #起始位置,终止位置(不包含),步长
    1 print(random.choice(['alex','wusir','eva_j']))
    2 从有序数据结构中随机选择一个
    1 print(random.choices(['wusir','tialaing','taihei','ritian'],k=2))
    2 随机选择两个,但是有重复
    1 print(random.sample(['wusir','tialaing','taihei','ritian'],k=2))
    2 随机选择两个,没有重复

     主要应用场景:微信随机红包、验证码、随机数:

     1 li = [1,2,3,4,6]
     2 random.shuffle(li)  # 洗牌 打乱顺序
     3 print(li)
     4 
     5 print(chr(65),chr(90),chr(97),chr(122))
     6 
     7 U = chr(random.randrange(65,91))
     8 L = chr(random.randrange(97,123))
     9 n1 = random.randrange(0,10)
    10 n2 = random.randrange(0,10)
    11 print(U, L,n1,n2)

    微信抢红包程序:

     1 import random
     2 def red_pac(money,num):
     3     ret = random.sample(range(1,money*100),num-1)
     4     ret.sort()
     5     ret.insert(0,0)
     6     ret.append(money*100)
     7     for i in range(len(ret)-1):
     8         value = ret[i+1] - ret[i]
     9         yield value/100
    10 
    11 g = red_pac(200,10)
    12 for i in g:
    13     print(i)

    三、time模块

    ①时间戳time.time()

    ②结构化时间time.localtime()

    ③字符串时间time.strftime()

    1 时间戳 -- 结构化时间        #time.localtime()
    2 结构化时间 -- 字符串时间    #time.strftime()
    3 
    4 字符串时间 -- 结构化时间    #time.strptime
    5 结构化时间 -- 时间戳       #time.mktime()

    例题:

     1 t = '2019-03-20 10:40:00'
     2 把这个时间向后退一个月
     3 # 1.转成结构化
     4 f = time.strptime(t,'%Y-%m-%d %X')
     5 # 2.结构化时间转成时间戳
     6 ts = time.mktime(f)
     7 # 3.将时间戳向大变
     8 new_ts = ts + 86400 * 30
     9 # 4.将最新的时间戳转成结构化时间
    10 new_f = time.localtime(new_ts)
    11 # 5.将结构化时间转成字符串时间
    12 print(time.strftime('%Y-%m-%d %X',new_f))
    13 
    14 获取当前时间求前一月的现在时间
    15 1.获取时间戳进行减法计算
    16 new_ts = time.time() - 30*86400
    17 # 2.最新的时间戳转成结构化时间
    18 new_f = time.localtime(new_ts)
    19 # 3.将结构化时间转成字符串时间
    20 print(time.strftime('%Y-%m-%d %X',new_f))

    四、os模块:主要和当前电脑操作系统做交互

    os模块与文件夹相关:
    1 import os
    2 os.makedirs('app/a/b/c')    # 递归创建文件       ***
    3 os.removedirs('app/a/b/c')  # 递归删除文件, 当这个要删除的目录有文件就停止删除  ***
    4 os.mkdir('app')         # 创建单个目录                ***
    5 os.rmdir('app')          # 删除单个目录,目录如果有东西就报错不进行删除    ***
    6 print(os.listdir('D:PyCharmProjects20day14'))    
    #查看某个目录下的内容****
    
    

    os模块和文件相关:

    1 os.remove()   #删除这个文件,删除了就不能恢复了    *****
    2 os.rename()   #修改文件的名字                  *****

    与操作系统相关:

    1 print(repr(os.sep))  #\
    2 C:UsersluckyDocumentsTencent Files932023756FileRecv
    3 路径符号
    
    
    1 print(os.popen('dir').read())               ***
    2 #在写程序的时候可以下发一些操作系统的指令
    3 #在linux系统上相当于发shell命令
    4 os.environ  获取系统环境变量

    与path执行路径相关

     1 print(os.path.abspath('b'))      ****
     2 获取当前文件的绝对路径
     3 print(os.path.split(r'D:PyCharmProjects20day14'))
     4 将这个文件的绝对路径分成目录和文件
     5 print(os.path.basename(r'D:PyCharmProjects20day14'))  **
     6 获取的是这个文件的名字
     7 print(os.path.dirname(r'D:PyCharmProjects20day14'))   ***
     8 获取的是这个文件的目录路径
     9 print(os.path.exists(r'D:PyCharmProjects20day107 今日总结.py')) **
    10 判断这个文件是否存在
    11 print(os.path.isabs(r'D:PyCharmProjects20day14'))
    12 判断是否是绝对路径
    13 
    14 print(os.path.join('C:\','app','a','b'))                 *****
    15 #路径拼接的  软件开发规范 框架
    16 
    17 os.stat()
    18 
    19 print(os.stat('b').st_size)   #获取文件大小 ,坑目录        ***
    20 print(os.getcwd())  # 获取工作路劲                         ***
    21 
    22 os.chdir('D:PyCharmProjects20day13')  # 路劲切换        *
    23 print(os.getcwd())

    五、sys模块:Python交互解释器交互的

    import sys

     1 print(sys.argv[-1])       ***
     2 接受cmd方式调用 后边的参数会传递进来
     3 linux系统上  -- 后端开发 -- 数据库(文件) ip + 端口
     4 
     5 print(sys.path)   # 添加自定义模块路径的                 # ******
     6 
     7 print(sys.version)  # 版本  获取解释的版本号
     8 
     9 sys.platform = 'win1988'
    10 
    11 print(sys.platform)   #获取当前操作系统的平台位数      # 可进行修改的
    12 
    13 print(sys.exit(1))

     六、hashlib

    应用:①密文形式存储用户登录密码信息;

       ②利用其不可逆不可改的特性验证数据是否被篡改。

    1 import hashlib
    2 md5 = hashlib.md5(''.encode('utf-8'))  # 选择加密方式  加盐
    3 md5.update('alex3714'.encode('utf-8')) # 将输入的明文转成字节然后进行加密
    4 print(md5.hexdigest())    # 打印生成的密文
    
    
    1 user,pwd = input('user|pwd:').strip().split('|')
    2 import hashlib
    3 
    4 md5 = hashlib.md5(str(user).encode('utf-8'))
    5 md5.update(pwd.encode('utf-8'))
    6 print(md5.hexdigest())
    以用户名作为加密方式:
    1
    user,pwd = input('user|pwd:').strip().split('|') 2 import hashlib 3 4 md5 = hashlib.md5(str(user).encode('utf-8')) 5 md5.update(pwd.encode('utf-8')) 6 print(md5.hexdigest())

    加密方式除了md5还有sha1,sha256,sha512,其md5以及被破解,但sha系列的hash算法还很安全。

    利用hashlib算法完成登录和注册页面的需求: 

     1 hashlib 注册系统
     2 import hashlib
     3 def md5(username,password):
     4     md5 = hashlib.md5(username[::-1].encode('utf-8'))
     5     md5.update(password.encode('utf-8'))
     6     return md5.hexdigest()
     7 
     8 def get_line():
     9     with open('userinfo', encoding='utf-8') as f:
    10         for line in f:
    11             user, pwd = line.strip().split(',')
    12             yield user,pwd
    13 
    14 def register():
    15     flag = True
    16     while flag:
    17         username = input('user :')
    18         password = input('passwd :')
    19         for user,pwd in get_line():
    20             if user == username:
    21                 print('您输入的用户名已经存在')
    22                 break
    23         else:
    24             flag = False
    25     password = md5(username,password)
    26     with open('userinfo',encoding='utf-8',mode='a') as f:
    27         f.write('%s,%s
    '%(username,password))

     登录系统
    1
    def login(): 2 username = input('user :') 3 password = input('passwd :') 4 for user,pwd in get_line(): 5 if username == user and pwd == md5(username,password): 6 return True 7 8 ret = login() 9 if ret: 10 print('登陆成功')

     七、re模块

    八、shutil模块  :删除文件夹(包括文件夹内的文件,)

    1 import shutil
    2 
    3 shutil.rmtree(path)
     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 """
     4 让用户执行脚本传入要删除的文件路径,在内部帮助用将目录删除。
     5 C:Python36python36.exe D:/code/s21day14/7.模块传参.py D:/test
     6 C:Python36python36.exe D:/code/s21day14/7.模块传参.py
     7 """
     8 import sys
     9 
    10 # 获取用户执行脚本时,传入的参数。
    11 # C:Python36python36.exe D:/code/s21day14/7.模块传参.py D:/test
    12 sys.argv = ["D:/code/s21day14/7.模块传参.py", "D:/test"]
    13 path = sys.argv[1]
    14 
    15 # 删除目录
    16 import shutil
    17 
    18 shutil.rmtree(path)

    九、getpass模块(密码不显示,在终端运行)

    1 import getpass
    2 
    3 pwd = getpass.getpass('请输入密码:')
    4 if pwd == '123':
    5     print('输入正确')
    
    
  • 相关阅读:
    有一群志同道合的程序员朋友是怎样的体验?
    hdu1387 模拟队列
    hau 1870 愚人节的礼物(栈)
    hdu1509 优先队列
    hdu1837 看病要排队(优先队列)
    hdu 1237 简单计算器(栈处理)
    hdu1022 模拟栈
    又一个错误的认知!
    jmeter+ant+jenkins 接口自动化测试持续集成(送源码)
    P1197 [JSOI2008]星球大战
  • 原文地址:https://www.cnblogs.com/chitangyuanlai/p/10560242.html
Copyright © 2011-2022 走看看