今日概要:
1、常用模块
- os模块
- random模块
- shutil模块
- hashlib模块
- pickle/json模块
- shelve模块
- configparser模块
- subprocess模块
- xml模块
- logging模块
- sys模块
- re模块
- time模块
- importlib模块
-base64模块
2、软件开发规范
3、初识面向对象
一、os模块
常规用法:
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd os.curdir 返回当前目录: ('.') os.pardir 获取当前目录的父目录字符串名:('..') os.makedirs('dirname1/dirname2') 可生成多层递归目录 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 os.remove() 删除一个文件 os.rename("oldname","newname") 重命名文件/目录 os.stat('path/filename') 获取文件/目录信息 os.sep 输出操作系统特定的路径分隔符,win下为"\",Linux下为"/" os.linesep 输出当前平台使用的行终止符,win下为" ",Linux下为" " os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为: os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix' os.system("bash command") 运行shell命令,直接显示 os.environ 获取系统环境变量 os.path.abspath(path) 返回path规范化的绝对路径 os.path.split(path) 将path分割成目录和文件名二元组返回 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 os.path.basename(path) 返回path最后的文件名。如何path以/或结尾,那么就会返回空值。即os.path.split(path)的第二个元素 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False os.path.isabs(path) 如果path是绝对路径,返回True os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间 os.path.getsize(path) 返回path的大小
示例:
#列出当前目录所有文件或者目录 os.listdir('.') import os print(os.path.abspath('a/b/c.txt')) #查看文件的绝对路径 print(os.path.abspath('/a/b/c.txt')) #E:ac.txt print(os.path.split('E:\a\c.txt')) print(os.path.dirname('E:\a\c.txt')) print(os.path.dirname('E:\a')) print(os.path.basename('E:\a\a,txt')) print(os.path.exists('E:\a')) print(os.path.exists(r'C:UsersliujiliangPycharmProjectspy_day_01dragonday06')) print(os.path.isabs('E:\day06')) print(os.path.isabs('day06')) print(os.path.getsize(r'C:UsersliujiliangPycharmProjectspy_day_01dragonday06 est.py')) #找到第一个绝对路径往后拼接,如果没有继续往后拼接,否则直接返回 print(os.path.join('a','E:\b','c.txt')) print(os.path.join('a','/b','c.txt')) #/b/c.txt #只在windows里有效,把上一级的..变成上一级目录 print(os.path.normcase('c:/wIndows\system32\') ) print(os.path.normpath('c://windows\System32\../Temp/'))
返回上一级目录示例:
import os,sys #__file__取当前文件 print(os.path.abspath(__file__)) BASE_DIR=os.path.dirname(os.path.dirname(__file__)) BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR) #E:/goto/s17/day06/bbb/spam.py/../.. BASE_DIR=os.path.normpath(os.path.join(__file__, os.pardir, os.pardir) ) print(BASE_DIR)
二、random模块
随机选取ip
import random proxy_ip=[ '1.1.1.1', '1.1.1.2', '1.1.1.3', '1.1.1.4', ] print(random.choice(proxy_ip))
取列表里任意两个元素组合示例:
import random print(random.sample([1,'23',[4,5]],2))
乱序组合示例:
import random item=[1,3,5,7,9] random.shuffle(item) print(item)
随机验证码示例:
def v_code(n=5): res='' for i in range(n): num=random.randint(0,9) s=chr(random.randint(65,90)) add=random.choice([num,s]) res+=str(add) return res print(v_code(6)) #输出结果 76R7B3
三、shutil模块
1、shutil.copyfileobj(fsrc, fdst[, length])
将文件内容copy到另外一个文件
import shutil shutil.copyfileobj(open('test.py','r'),open('test1.py','w'))
2、shutil.copyfile(src, dst)
copy文件,目标文件不需要存在
shutil.copyfile('f1.log', 'f2.log') #目标文件无需存在
3、shutil.copymode(src, dst)
仅copy权限,内容、用户、组全都不变
shutil.copymode('f1.log', 'f2.log') #目标文件必须存在
4、shutil.copystat(src, dst)
仅拷贝状态的信息,包括:mode bits, atime, mtime, flags
shutil.copystat('f1.log', 'f2.log') #目标文件必须存在
5、shutil.copytree(src, dst, symlinks=False, ignore=None) shutil.ignore_patterns(*patterns)
递归去copy文件
import shutil shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) #目标目录不能存在,注意对folder2目录父级目录要有可写权限,ignore的意思是排除
copy软连接
import shutil shutil.copytree('f1', 'f2', symlinks=True, ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) ''' 通常的拷贝都把软连接拷贝成硬链接,即对待软连接来说,创建新的文件 '''
6、shutil.move(src, dst)
递归的去移动文件,它类似mv命令,其实就是重命名。
import shutil shutil.move('folder1', 'folder3')
7、shutil.make_archive(base_name, format,...)
创建压缩包并返回文件路径,例如:zip、tar
创建压缩包并返回文件路径,例如:zip、tar
- base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,
如 data_bak =>保存至当前路径
如:/tmp/data_bak =>保存至/tmp/ - format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
- root_dir: 要压缩的文件夹路径(默认当前目录)
- owner: 用户,默认当前用户
- group: 组,默认当前组
- logger: 用于记录日志,通常是logging.Logger对象
#将 /data 下的文件打包放置当前程序目录 import shutil ret = shutil.make_archive("data_bak", 'gztar', root_dir='/data') #将 /data下的文件打包放置 /tmp/目录 import shutil ret = shutil.make_archive("/tmp/data_bak", 'gztar', root_dir='/data')
shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的
tarfile示例:
#解压 import tarfile t=tarfile.open('data_bak.tar.gz','r') t.extractall('extract_dir') t.close() #压缩 import tarfile t=tarfile.open('egon1.tar','w') t.add(r'E:wupeiqis17day06bb.py',arcname='a.bak') t.add(r'E:wupeiqis17day06bbspam.py',arcname='b.bak') t.close() t=tarfile.open('egon1.tar','r') t.extractall('extract_dir2')
zipfile示例:
import zipfile # 压缩 z = zipfile.ZipFile('laxi.zip', 'w') z.write('a.log') z.write('data.data') z.close() # 解压 z = zipfile.ZipFile('laxi.zip', 'r') z.extractall(path='.') z.close()
四、hashlib模块
MD5 算法
三个特点:
1.内容相同则hash运算结果相同,内容稍微改变则hash值则变
2.不可逆推
3.相同算法:无论校验多长的数据,得到的哈希值长度固定。
m = hashlib.md5() #生成一个对象 #python3默认是unicode,需要进行encode m.update('1311323213哈哈'.encode('utf-8')) print (m.hexdigest())
读一个10G的文件,md5校验方法
m = hashlib.md5() with open(r'/home/alex','rb') as f : for line in f : m.update(line) md5_num = m.hexdigest()
密码加严
#hmac版本 import hmac h = hmac.new('123123'.encode('utf-8')) h.update('helloword'.encode('utf-8')) print (h.hexdigest()) #hashlib版本 import hashlib m = hashlib.md5('123123'.encode('utf-8')) m.update('123'.encode('utf-8')) print (m.hexdigest())
模拟撞库
import hashlib passwds=[ 'alex3714', 'alex1313', 'alex94139413', 'alex123456', '123456alex', 'a123lex', ] def make_passwd_dic(passwds): dic={} for passwd in passwds: m=hashlib.md5() m.update(passwd.encode('utf-8')) dic[passwd]=m.hexdigest() return dic def break_code(cryptograph,passwd_dic): for k,v in passwd_dic.items(): if v == cryptograph: print('密码是===>