今日概要:
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('密码是===>