常用模块
什么是模块 ?
在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码会越来越长,越来越不容易维护。
为了编写可维护的代码,我们把很多的函数分组,分别放到不同的文件里,这样每个文件包含的代码就相对较少了,很多编程语言都采用了这种组织代码的方式。在Python中,一个.py文件就可以称之为一个模块 module
模块分为三种:
内置标准模块(又称标准库),执行help(‘modules‘) 查看所有Python自带模块列表
第三方开源模块,可通过pip install 模块名 联网安装
自定义模块,自己写的模块
模块 导入&调用
Import module # 导入 import os ,sys print(os.path) from os import path #直接导入path模块,直接使用path,无需os.path print(path) from asyncio.events import get_event_loop as get_events #as想当于重命名 print(get_events())
自定义模块
Module_custom.py name = 'alex' print('hello',name) def sayhi(n): print('hi',n) Module_importcustom.py import Modules.Module_custom as name name.sayhi('jack')
安装第三方模块
开源的Python镜像网站
pypi.org
pypi.douban.com/simple 豆瓣的使用方法 pip install -i http://pypi.douban.com/simple/ paramiko
import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('10.3.10.241',22,'deepin','deepin1') stdin,stdout,stderr = ssh.exec_command('ip add') print(stdout.read().decode('utf-8')) ssh.close()
Sys、os模块的使用
# -*- coding:utf-8 -*- import os print(__file__) # 打印一个当前脚本的路径 print(os.getcwd()) # 获取当前脚本的目录pwd print(os.listdir("/tmp")) #、获取/tmp目录下的文件 os.path.isfile('/tmp/abc') # 判断/tmp/abc 是否是一个文件 os.path.isdir('/tmp') # 判断/tmp 是否是一个目录 os.path.isabs('~/ccn') #判断一个文件是不是绝对路径 os.path.split("/tmp/abc") # 提取出目录名,文件名 分开显示 os.path.dirname("/tmp/abc") # 只获取目录名 ,不获取文件名 os.path.abspath("~/ccn") #获取绝对路径 os.stat("/tmp") # 获取/tmp文件属性 相当于 linux下的stat os.chmod('/tmp') #修改/tmp权限 相当于linux下chmod功能一样 os.kill(123,9) #杀死相关进程 前边是进程号 后边是kill的信号 相当于linux下的kill -9
import sys sys.argv # 命令行参数list ,第一个元素是程序本身路径 sys.exit(0) # 退出程序 ,正常退出时exit(0) sys.version # 获取Python解释程序的版本信息 sys.maxint # 最大的int值 sys.path #返回模块Module的搜索路径 sys.platform #返回操作系统平台的名称 sys.getrecursionlimit() # 获取最大递归层数 default 100 sys.setrecursionlimit(1500) #设置最大递归层数 1500 sys.getdefaultencoding() #获取解释器 使用的默认编码 utf8 sys.getfilesystemencoding() # 获取数据存储到文件里的默认编码 utf8
时间模块
时间处理归为三种:
时间的显示 , 在屏幕显示、记录日志等
时间的转换 , 比如把字符串格式的日期转换成Python中的日期类型
时间的运算,计算两个日期间的差值等
time模块
1.时间戳 ,表示的1970年1月1日0.0.0分
2.格式化的时间字符串,比如’2020-10.03 10:00’
3.元祖共九个元素,由于Python的time模块实现主要调用的c库,平台上不一样
UTF 时间
UTF世界标准时间, 中国为UTF+8,又称东8区
time模块的方法(以上都可以传时间秒数的参数,如果不传默认使用的是系统的时间戳)
Time.localtime() # 将秒数转化成 年的方法- 正常显示的时间
Time.getime() # 将时间转换成世界时间
Time.mktime() # 将时间时间转化成时间戳(秒数)
Time.sleep() # 延时五分钟
time.asctime() #把一个表示时间的元祖或者世界时间表示为这种形式:Fri Mar 27 22:46:17 2020
Time.ctime() #把一个时间戳转换成time.asctime()的形式
Time.strftime() # 将时间转换成你想要的字符串格式 print(time.strftime("%Y-%m-%d",time.localtime()))
Time.strptime() #将字符串格式转换成日期print(time.strptime("2020.1.2 10:10","%Y.%m.%d %H:%M"))
Datetime 模块
Datetime模块定义了下面的这几类:
Datetime.data 表示日期的一个类
datetime.date.today()
datetime.date(2020, 3, 27)
datetime.date.fromtimestamp(1222222222) #将时间戳转换成时间
datetime.date(2008, 9, 24)
Datetime.time 表示时间的类
Datetime.datetime 表示日期时间的类型
datetime.datetime.now()
datetime.datetime(2020, 3, 27, 23, 5, 37, 909430)
datetime.datetime.fromtimestamp(123455)
datetime.datetime(1970, 1, 2, 18, 17, 35)
t1 = datetime.datetime.now()
t1 - datetime.timedelta(days=3)
datetime.datetime(2020, 3, 24, 23, 8, 55, 386942)
datetime.datetime.now().replace(year=20,month=10,day=5,minute=1,hour=1)
datetime.datetime(20, 10, 5, 1, 1, 31, 412669)
Pytz模块
Pytz.alltimezones 查看所有时区
Datetime.datetime.now(tz = pytz.timezone(“Africa/Abidjan”))
Random随机数模块
# -*- coding:utf-8 -*- import random import string print(random.randrange(1,10)) # 返回1-10之间的一个随机数,不包括10 print(random.randint(1,10)) # 返回1-10之间的一个随机数,包括10 print(random.random()) # 返回一个随机浮点数,小数 print(random.choice('qwrrqtyeywy')) #返回给定字符串中的随机一个字符 print(random.sample('3143445sfwrqrt',4)) #返回给定字符串中,4个随机字符,以列表形式显示 print("".join(random.sample(string.digits+string.ascii_lowercase+string.ascii_uppercase,4))) # 生成随机4位验证码 a = list(string.digits+string.ascii_lowercase+string.ascii_uppercase) #洗牌将数字大小写英文 使用shuffle打乱顺序 random.shuffle(a) print(a)
序列化pickle & json模块
Pickle ----pickle 可以多次dump 多次load 但建议只一次
# -*- coding:utf-8 -*- import pickle d = { "name":"alex", "role":"police", "blood":"76", "weapon":"AK47" } arrive_players = ["alex","jack","rain" ] # d_dump = pickle.dumps(d) # dumps叫做序列化,将不同的数据类型,转换成bytes格式,存入硬盘 # print(d_dump) # # print(pickle.loads(d_dump)) #loads叫做反序列化,将bytes字节类型转换成相应的数据类型 # f = open("game.pkl","wb") #存入的是16进制数,所以用wb格式 pickle.dump(d,f) # pickle.dump 方法直接可以序列化的存入文件内 pickle.dump(arrive_players,f) f = open("game.pkl","rb") # 因为存入的是进制数,所以取也要用rb模式取 print(pickle.load(f)) # pickle.load将序列化的数据读取出来,序列化了几次就要取几次 print(pickle.load(f))
# dump是写入文件,dumps是在内存中生成序列化的字符串
# load从文件加载,反序列化, loads把序列化的字符串反向解析 建议只dump一次,否则程序多会乱
Json ------json 一个文件只能一次dump ,一次load
import json d = { "name":"alex", "role":"police", "blood":"76", "weapon":"AK47" } arrive_players = ["alex","jack","rain" ] #print(json.dumps(d)) f = open("game.json",'w') json.dump(d,f) #json.dump(arrive_players,f) f = open("game.json",'r') print(json.load(f))
Pickle 和 json的区别
Pickle只支持python,支持所有的数据类型 时间都可以
json 支持所有变成语言 .只支持常规的数据类型str . int .dict.set . list .tuple
Hashlib加密模块
Md5功能
输入任意长度的信息,经过处理,输出为128位的信息(数字指纹):
不同的输入得到的不同的结果(唯一性)
Md5算法的特点
1. 压缩性:任意长度的数据,算出的md5值的长度都是固定的.
2. 容易计算:从元数据计算出md5值很容易
3. 抗修改性:对源数据进行任何改动,修改一个字节生成的md5值区别也很大
4. 强抗碰撞: 已知原数据和md5,想找到一个具有相同md5值的数据(即伪造数据)是非常困难的.
Md5算法是否可逆
Md5不可逆的原因是一种散列函数,使用的hash算法,在计算过程中原文的部分信息是丢失了的.
Md5的用途
1. 防止被篡改
2. 防止直接看到明文
3. 防止抵赖(数字签名)
import hashlib m = hashlib.md5() m.update(b"hello alex") print(m.hexdigest()) m.update("房纠纷解决".encode("utf8")) #print(m.digest()) print(m.hexdigest())
Hashlib -- sha加密算法
s1 = hashlib.sha1()
s1.update('发发发'.encode("utf-8"))
s1.hexdigest()
'22b90f88377478e852388db42b707488ed8cf3c9'
s2 = hashlib.sha3_256()
s2.update("嘻嘻".encode("utf-8"))
s2.hexdigest()
'd3b4813643938fb3cf57b775c947dd638b59f60bcc9258ed400b6e0fbbf5a925'
文件copy模块shutil
import shutil shutil.copyfileobj(open("game.json"),open("game2.json",'w')) shutil.copyfile("game.json","game3.json") shutil.copymode() #仅copy权限,内容组用户均不变 不会copy内容,目标文件必须存在 shutil.copystat() #仅copy状态的信息 mtime ctime atime,不会copy内容,目标文件必须存在 shutil.copy() #copy权限和内容 shutil.copy2() # copy权限和状态的信息 shutil.copytree() #copy整个目录 shutil.copytree("../Modules","Modules_cpoy",ignore=shutil.ignore_patterns("*.py","*.pkl")) # ignore排除相应文件进行copy shutil.rmtree() # 删除文件 shutil.move() #移动文件 shutil.make_archive(base_name="/tmp/code.bak",format="zip",root_dir="../Modules",owner="root") #创建压缩包
Zipfile 压缩模块
import zipfile import os z = zipfile.ZipFile("/tmp/test_copy.zip","w") #压缩 filelist = [] for root_dir,dirs,files in os.walk("../Modules"): #.代表当前目录 for name in files: filelist.append(os.path.join(root_dir,name)) for i in filelist: print(i) z.write(i) z.close() z = zipfile.ZipFile("/tmp/test_copy.zip",'r') #解压 z.extractall(path="/root") z.close()
牛逼的Re正则模块
Re.match 从头开始匹配 Re.findall 匹配所有值 匹配出所有的值以列表返回 Re.search 包含匹配 匹配出来第一个就返回 Re.split 以匹配到的字符当做列表分隔符 re.split("[0-9]","alex3jack4rain5mack") ['alex', 'jack', 'rain', 'mack'] Re.sub 匹配字符并替换 re.sub("abc","ABc","abcabcerrr") 'ABcABcerrr' re.sub("abc","ABc","abcabcerrr",count=1) 'ABcabcerrr' Re.fullmatch j精确匹配 re.fullmatch("abc","abc") 相当于re.search("^abc$",”abc”)
'.' 匹配任意除 之外的任意字符
'^' 匹配开头
'$' 匹配结尾
'*' 匹配前一个字符0次或多次
'+' 匹配前一个字符1次或多次
'?' 匹配前一个字符0次或1次
'{m}' 匹配前一个字符m次
'{n,m}' 匹配前一个字符n次到m次
'{|}' 匹配或
'{}'分组匹配 re.search(“(abc){1}a(123|45)”,”abcabca12345”)
'A'只从字符开头匹配
'' 相当于$ 匹配字符结尾 re.search("Aabc","abc") 只能是abc
[] re.search("[a-zA-z0-9]{11}","131414fsq3144f")
'd' 匹配数字0-9 re.search("d+","d3425") +一次或多次 ?一次或0次 0一次或多次
'D' 匹配非数字 re.findall("D+","1324fs1sadf31fds")
'w' re.search("w+","123qrt135") 匹配[a-zA-z0-9]
'W' 匹配非[a-zA-z0-9]
's'匹配 空白字符
a= re.search("(?P<province>[0-9]{3})(?P<city>[0-9]{3})(?P<birt>[0-9]{4})",id_num)
a.group()
'1504301998'
a.groups()
('150', '430', '1998')
a.groupdict() re.split("[0-9]","alex3jack4rain5mack")
['alex', 'jack', 'rain', 'mack']
{'province': '150', 'city': '430', 'birt': '1998'}
Re.compile 制定匹配规则 ,直接拿来用.适合非常大的数据量,匹配规则还是一样的
p = re.compile("w{11}")
p.search("1234567892134658")
<re.Match object; span=(0, 11), match='12345678921'>
Flags 标志符
re.search("elf","alexrwfElf",re.I) re.I忽略大小写
re.search("^alex"," alexjackrain",re.M)
<re.Match object; span=(1, 5), match='alex'> re.M多行模式 search只搜索第一行
re.search("."," ",re.S) re.S 可以匹配
软件项目的目录设计规范
目的:
1. 可读性高
2. 可维护性高
Bin/ 存放项目的一些可执行文件 脚本之类的
Docs/存放,使用的文档
Conf/ 存放配置文件
Setup.py 安装 部署 打包的脚本
Requirements.txt 存放软件依赖的外部python包列表 自动生成这个文件 pip freeze > requirements.txt 使用这个文件 pip install -r requirements.txt
README 项目说明文件
Bin/ 存放项目的一些可执行文件 脚本之类的
Test/ 存放目录的源代码
Docs/存放,使用的文档
Conf/ 存放配置文件
Setup.py 安装 部署 打包的脚本
Requirements.txt 存放软件依赖的外部python包列表 自动生成这个文件 pip freeze > requirements.txt 使用这个文件 pip install -r requirements.txt
README 项目说明文件
包&跨模块代码调用
>>> import mypackage
------welcome invoke my first package
>>> from mypackage import fir
哈哈