常用模块
Posted zjaiccn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用模块相关的知识,希望对你有一定的参考价值。
常用模块
什么是模块 ?
在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码会越来越长,越来越不容易维护。
为了编写可维护的代码,我们把很多的函数分组,分别放到不同的文件里,这样每个文件包含的代码就相对较少了,很多编程语言都采用了这种组织代码的方式。在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
哈哈
以上是关于常用模块的主要内容,如果未能解决你的问题,请参考以下文章