第四章节
1、什么是模块
2、模块的好处
最大的好处是大大提高了代码的可维护性
使用模块还可以避免函数名和变量名冲突
3、模块的分类
1.标准模块(标准库、内置模块)
有近300个,随时可以调用
2.第三方模块
近18w个左右
需要单独安装 pip install
3.自定义模块
自己写的
模块的导入和调用
import
from os import rename,path,replace
rename()
path()
replace()
模块的导入要写在首行
模块的调用方法:
mport module
from module import xx
from module.xx.xx import xx as rename
from module.xx.xx import *
自定义模块
模块的查找路径:
全局能导入:
把文件放到第三方模块的路径下,就可以实现全局调用
第三方模块的安装和使用
https://pypi.org/
直接pip安装
pip命令会自动下载模块包病完成安装
软件一般会被自动安装你python安装目录的这个字目录里:
/your_python_install_path/3.6/lib/python3.6/site-packages
sudo pip install -i http://pypi.douban.com/simple/ alex_sayhi --trusted-host pypi.douban.com #alex_sayhi是模块名
OS模块
得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd
>>> os.getcwd()
'C:\\Users\\hanjj20688'
>>>
返回指定目录下的所有文件和目录名:os.listdir()
>>> os.listdir()
['.PyCharm2018.3', '3D Objects', 'AppData', 'Application Data', 'Contacts', 'Cookies', 'Desktop', 'Documents', 'Downloads', 'Evernote', 'Favorites', 'IntelGraphicsProfiles', 'Links', 'Local Settings', 'MicrosoftEdgeBackups', 'Music', 'My Documents', 'NetHood', 'NTUSER.DAT', 'ntuser.dat.LOG1', 'ntuser.dat.LOG2', 'NTUSER.DAT{8ebe95f7-3dcb-11e8-a9d9-7cfe90913f50}.TM.blf', 'NTUSER.DAT{8ebe95f7-3dcb-11e8-a9d9-7cfe90913f50}.TMContainer00000000000000000001.regtrans-ms', 'NTUSER.DAT{8ebe95f7-3dcb-11e8-a9d9-7cfe90913f50}.TMContainer00000000000000000002.regtrans-ms', 'ntuser.ini', 'ntuser.pol', 'Pictures', 'PrintHood', 'Recent', 'Saved Games', 'Searches', 'SendTo', 'Templates', 'Videos', '「开始」菜单']
>>>
获取当前路径下的文件
>>> os.listdir(".")
['.PyCharm2018.3', '3D Objects', 'AppData', 'Application Data', 'Contacts', 'Cookies', 'Desktop', 'Documents', 'Downloads', 'Evernote', 'Favorites', 'IntelGraphicsProfiles', 'Links', 'Local Settings', 'MicrosoftEdgeBackups', 'Music', 'My Documents', 'NetHood', 'NTUSER.DAT', 'ntuser.dat.LOG1', 'ntuser.dat.LOG2', 'NTUSER.DAT{8ebe95f7-3dcb-11e8-a9d9-7cfe90913f50}.TM.blf', 'NTUSER.DAT{8ebe95f7-3dcb-11e8-a9d9-7cfe90913f50}.TMContainer00000000000000000001.regtrans-ms', 'NTUSER.DAT{8ebe95f7-3dcb-11e8-a9d9-7cfe90913f50}.TMContainer00000000000000000002.regtrans-ms', 'ntuser.ini', 'ntuser.pol', 'Pictures', 'PrintHood', 'Recent', 'Saved Games', 'Searches', 'SendTo', 'Templates', 'test', 'test.txt', 'Videos', '「开始」菜单']
>>>
函数用来删除一个文件:os.remove()
>>> os.remove("试验用.txt")
>>> os.remove("那些人.txt")
删除多个目录:os.removedirs(r“c:\python”)
?
检验给出的路径是否是一个文件:os.path.isfile()
检验给出的路径是否是一个目录:os.path.isdir()
判断是否是绝对路径:os.path.isabs()
检验给出的路径是否真地存:os.path.exists()
返回一个路径的目录名和文件名:os.path.split() e.g os.path.split('/home/swaroop/byte/code/poem.txt') 结果:('/home/swaroop/byte/code', 'poem.txt')
分离扩展名:os.path.splitext() e.g os.path.splitext('/usr/local/test.py') 结果:('/usr/local/test', '.py')
获取路径名:os.path.dirname()
获得绝对路径: os.path.abspath()
打印当前脚本所在的路径,包含文件名【打印的是绝对路径】
import os
print(__file__)
输出
D:\py\Learning\venv\Scripts\python.exe D:/py/Learning/第四模块/account.json.py
D:/py/Learning/第四模块/account.json.py
获取文件名:os.path.basename()
运行shell命令: os.system()
读取操作系统环境变量HOME的值:os.getenv("HOME")
返回操作系统所有的环境变量: os.environ
设置系统环境变量,仅程序运行时有效:os.environ.setdefault('HOME','/home/alex')
给出当前平台使用的行终止符:os.linesep Windows使用'\r\n',Linux and MAC使用'\n'
指示你正在使用的平台:os.name 对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'
重命名:os.rename(old, new)
>>> os.listdir(".")
['.PyCharm2018.3', '3D Objects', 'AppData', 'Application Data', 'Contacts', 'Cookies', 'Desktop', 'Documents', 'Downloads', 'Evernote', 'Favorites', 'IntelGraphicsProfiles', 'Links', 'Local Settings', 'MicrosoftEdgeBackups', 'Music', 'My Documents', 'NetHood', 'NTUSER.DAT', 'ntuser.dat.LOG1', 'ntuser.dat.LOG2', 'NTUSER.DAT{8ebe95f7-3dcb-11e8-a9d9-7cfe90913f50}.TM.blf', 'NTUSER.DAT{8ebe95f7-3dcb-11e8-a9d9-7cfe90913f50}.TMContainer00000000000000000001.regtrans-ms', 'NTUSER.DAT{8ebe95f7-3dcb-11e8-a9d9-7cfe90913f50}.TMContainer00000000000000000002.regtrans-ms', 'ntuser.ini', 'ntuser.pol', 'Pictures', 'PrintHood', 'Recent', 'Saved Games', 'Searches', 'SendTo', 'Templates', 'test', 'test.txt', 'Videos', '「开始」菜单']
>>> os.rename("test.txt","test22.txt")
>>> os.listdir(".")
['.PyCharm2018.3', '3D Objects', 'AppData', 'Application Data', 'Contacts', 'Cookies', 'Desktop', 'Documents', 'Downloads', 'Evernote', 'Favorites', 'IntelGraphicsProfiles', 'Links', 'Local Settings', 'MicrosoftEdgeBackups', 'Music', 'My Documents', 'NetHood', 'NTUSER.DAT', 'ntuser.dat.LOG1', 'ntuser.dat.LOG2', 'NTUSER.DAT{8ebe95f7-3dcb-11e8-a9d9-7cfe90913f50}.TM.blf', 'NTUSER.DAT{8ebe95f7-3dcb-11e8-a9d9-7cfe90913f50}.TMContainer00000000000000000001.regtrans-ms', 'NTUSER.DAT{8ebe95f7-3dcb-11e8-a9d9-7cfe90913f50}.TMContainer00000000000000000002.regtrans-ms', 'ntuser.ini', 'ntuser.pol', 'Pictures', 'PrintHood', 'Recent', 'Saved Games', 'Searches', 'SendTo', 'Templates', 'test', 'test22.txt', 'Videos', '「开始」菜单']
创建多级目录:os.makedirs(r“c:\python\test”)
创建单个目录:os.mkdir(“test”)
获取文件属性:os.stat(file)
>>> os.listdir(".")
['.PyCharm2018.3', '3D Objects', 'AppData', 'Application Data', 'Contacts', 'Cookies', 'Desktop', 'Documents', 'Downloads', 'Evernote', 'Favorites', 'IntelGraphicsProfiles', 'Links', 'Local Settings', 'MicrosoftEdgeBackups', 'Music', 'My Documents', 'NetHood', 'NTUSER.DAT', 'ntuser.dat.LOG1', 'ntuser.dat.LOG2', 'NTUSER.DAT{8ebe95f7-3dcb-11e8-a9d9-7cfe90913f50}.TM.blf', 'NTUSER.DAT{8ebe95f7-3dcb-11e8-a9d9-7cfe90913f50}.TMContainer00000000000000000001.regtrans-ms', 'NTUSER.DAT{8ebe95f7-3dcb-11e8-a9d9-7cfe90913f50}.TMContainer00000000000000000002.regtrans-ms', 'ntuser.ini', 'ntuser.pol', 'Pictures', 'PrintHood', 'Recent', 'Saved Games', 'Searches', 'SendTo', 'Templates', 'test', 'test22.txt', 'Videos', '「开始」菜单']
>>> os.stat("test22.txt")
os.stat_result(st_mode=33206, st_ino=22799473113716506, st_dev=906384342, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1568032366, st_mtime=1568032366, st_ctime=1568032366)
>>>
修改文件权限与时间戳:os.chmod(file)
获取文件大小:os.path.getsize(filename)
结合目录名与文件名:os.path.join(dir,filename)
改变工作目录到dirname: os.chdir(dirname)
获取当前终端的大小: os.get_terminal_size()
杀死进程: os.kill(10884,signal.SIGKILL)
sys模块
time模块
对时间处理,有如下三种操作
时间的显示
时间的转换
时间的运算
通常有这几种方式来表示时间
1. 时间戳
2. 格式化的时间字符串 如2019-09-22
3. 元祖(9个元素)即struct_time
time.time() 返回当前时间的时间戳
import time
print(time.time()) #返回当前时间的时间戳
time.localtime() 将一个时间戳转换为当前时区struct_time
import time
print(time.localtime())
time.gmtime() 跟time.localtime()相似,将一个时间戳转换为UTC时区的struct_time
print(time.localtime())
print(time.gmtime())
<<<
D:\py_lise\dayday\venv\Scripts\python.exe D:/py_lise/dayday/第四章节/test1.py
time.struct_time(tm_year=2019, tm_mon=9, tm_mday=22, tm_hour=23, tm_min=13, tm_sec=4, tm_wday=6, tm_yday=265, tm_isdst=0)
time.struct_time(tm_year=2019, tm_mon=9, tm_mday=22, tm_hour=15, tm_min=13, tm_sec=4, tm_wday=6, tm_yday=265, tm_isdst=0)
time.mktime 将一个struct_time转换为时间戳
print(time.mktime(time.localtime()))
>>>
1569165404.0
time.sleep(secs) 线程推迟指定的时间运行
time.sleep(5)
print("----------------")
time.asctime(t) 把一个表示时间的元祖或者struct_time表示为这种形式:Sun Sep 22 23:24:19 2019v,如果没有参数,将会将time.locatime()作为参数参入
print(time.asctime())
<<<
Sun Sep 22 23:24:19 2019
time.strftime() 把一个代表时间的元祖或者struct_time转化为格式化的时间字符串
time.strptime() 把一个格式化的时间字符串转化为struct_time,和time.strftime() 向逆
datetime模块
random 随机数模块
验证码
命名规范:random_mod.py
1.random.randrange >>返回1-10之间的一个随机数,不包括10
import random
random.randint(1,10)
2.random.randint(1,10) >>返回1-10之间的一个随机数,包括10
>>> random.randint(1,10)
9
>>>
3. random.randrange(0,100,2) 随机选择0-100的偶数
import random
print(random.randrange(0,100,2))
4.random.rangdom() 返回一个随机浮点数
import random
print(random.random())
5.random.choice()返回一个给定数据集合中的随机字符
import random
print(random.choice('avfsdd$98'))
6.random.sample() 从多个字符中选取特定数量的字符
import random
print(random.sample('avfsdd$98',3))
string 生成随机字符串
1. string.ascii_lowercase 返回有序的小写字符
import string
print(string.ascii_lowercase)
2.string.digits
import string
print(string.ascii_lowercase)
print(string.digits)
生成随机字符串
import string
import random
a=string.ascii_lowercase+string.digits
print(a)
b=random.sample(a,5)
print("".join(b))
洗牌
import string
import random
a=string.digits
print(a)
b=list(a)
print(b)
random.shuffle(b)
print(b)
序列化pick&json模块
import pickle
d = {'k1':'v1','k2':'v2'}
f_dumps = pickle.dumps(d) #序列化
d_dumps = pickle.loads(f_dumps) #反序列化
print(d_dumps)
f = open("game.pkl","wb")
pickle.dump(d,f)
import pickle
f = open("game.pkl","rb")
d1=pickle.load(f)
print(d1)
dump 写入文件
dumps 生成序列化的字符串
load 从文件加载
loads 把序列化的字符串反向解析
json VS pickle
import json
d = {'k1':'v1','k2':'v2'}
json_1 = json.dumps(d)
print(json_1)
print(type(json_1))
输入:
{"k1": "v1", "k2": "v2"}
<class 'str'>
import json
d = {'k1':'v1','k2':'v2'}
# json_1 = json.dumps(d)
# print(json_1)
# print(type(json_1))
f = open("json.json","w")
json_2 = json.dump(d,f)
print(json_2)
import json
f = open("json.json","r")
json_3 = json.load(f)
print(json_3)
区别
json:
支持所有语言
只支持常规的数据类型,str,int, dict, list ,tuple
pickle:
只支持python
支持python里所有的数据类型
hashlib 加密
散列
hash碰撞
两个不同的输入,转化成相同的输出
在当前进程下,hash出的值是唯一,如果退出则变掉了
加密算法在hash的基础上加工而成的
MD5
可以产生128位的散列值
特点“
1、压缩性
2、容易计算
3、抗修改性
4、强抗碰撞
MD5 不可逆
MD5的用途
1、防止篡改
2、防止看到明文
3、防止抵赖(数字签名)
SHA-1
安全hash算法
160位
升级SHA-256
文件copy模块shutil
正则表达式
字符串的匹配规则,
. 默认匹配除\n之外的任意一个字符,
>>> re.search(".","abcddd")
<re.Match object; span=(0, 1), match='a'>
>>>
^ 匹配字符开头
>>> re.search("^a","abcddd")
<re.Match object; span=(0, 1), match='a'>
>>> re.search("^abc","abcddd")
<re.Match object; span=(0, 3), match='abc'>
>>>
$ 匹配字符结尾
>>> re.search("abc$","abcdddabc")
<re.Match object; span=(6, 9), match='abc'>
>>>
* 匹配*号前的字符0次或多次
>>> re.search("a*","aaaaaaaaaaaaaabcabcdddabc")
<re.Match object; span=(0, 14), match='aaaaaaaaaaaaaa'>
>>>
+ 匹配前一个字符1次或多次
>>> re.findall("aa+","aa9900888")
['aa']
>>> re.findall("aa+","aaaaaaa9900888")
['aaaaaaa']
>>> re.findall("aa+","aaaaaaa9900888aaa")
['aaaaaaa', 'aaa']
>>> re.findall("aa+","aaaaaaa990088aaa8aaa")
['aaaaaaa', 'aaa', 'aaa']
>>>
? 匹配前一个字符1次或0次
>>> re.search("a?","aaaaaaaaaaaaaabcabcdddabc")
<re.Match object; span=(0, 1), match='a'>
>>>
{m} 匹配前一个字符m次
>>> re.search('b{3}','alexbbbs').group()
'bbb'
>>>
{n,m} 匹配一个字符n到m次
>>> re.findall('b{2,3}','bbalbbbbexbbbs')
['bb', 'bbb', 'bbb']
>>>
| 匹配左或右的字符
>>> re.search('b|a','alexbbbs').group()
'a'
>>> re.search('b|a','balexbbbs').group()
'b'
>>>
(……) 分组匹配,
>>> re.search("(abc){2}a(123|45)", "abcabca456c").group()
'abcabca45'
>>>
\A 只从字符开头匹配
>>> re.search('\Aa','abalexbbbs')
<re.Match object; span=(0, 1), match='a'>
>>>
\Z 匹配字符结尾 同$
>>> re.search('a\Z','balexbbbsa')
<re.Match object; span=(9, 10), match='a'>
>>>
\d 匹配数字0-9 且只匹配一次
>>> re.search('\d','balexbb89999')
<re.Match object; span=(7, 8), match='8'>
>>>
\D 匹配非数字 且只匹配一次
>>> re.search('\D','balexbb89999')
<re.Match object; span=(0, 1), match='b'>
>>>
\w 匹配【A-Za-z0-9】 只匹配一次
>>> re.search('\w','balexbb89999')
<re.Match object; span=(0, 1), match='b'>
>>> re.search('\w','9balexbb89999')
<re.Match object; span=(0, 1), match='9'>
>>>
\W 匹配非【A-Za-z0-9】 只匹配一次
>>> re.search('\W','9balexbb89999****')
<re.Match object; span=(13, 14), match='*'>
>>>
s 匹配空白字符、\t、\n、\r 只匹配一下
>>> re.search("\s+","ab\tc1\n3").group()
'\t'
>>> re.search("\s+","ab\nc1\n3").group()
'\n'
>>>
(?P……) 分组匹配
re的匹配语法有一下几种
re.match 从头开始匹配
re.search 匹配包含
re.findall 把所有匹配到的字符放到以列表中的元素返回
re.split 以匹配到的字符当作列表分隔符
re.sub 匹配字符并替换
re.fullmatch 全部匹配
re.fullmatch
(pattern,string,flags=0)
pattern 正则表达式
string 要匹配的字符串
flags 标志位,用于控制正则表达式的匹配方式