Python常用模块Day06
模块\包
模块:用力啊从逻辑组织python代码(变量,函数,类,逻辑:实现一个功能)本质就是.py结尾的python文件,(文件名:test.py,对应的模块名:test)
包:从逻辑上组织模块,本质就是一个目录(必须带一个__init__.py文件)
导入方法:
import test
import test,test1,test2…..
form test import * 不介意使用-慢
form test import m1,m2,m3…
from test import longer as logger_name 快
import 本质(路径搜索和搜索路径)
导入模块的本质就是把python文件解释一遍,
import test —> test.py ——> test.py 的路径 —> sys.path
导入包的本质就是 执行该包下的 __init__.py文件
from . import test 当前目录导入
导入优化
form test import m1,m2,m3…
from test import longer as logger_name 快
使用import 关键字,可以将一个包中已出现的一个或多个函数或模块,引入到另一个python代码中,从而实现代码的复用
注意
- 如果是本地导入文件,直接使用:import filename
- 如果导入的是一个包,该包下面必须是有__init__.py文件才可以导入,否则报错,只有有了__init__.py文件,python解析器才会把这个目录当成是的包
模块分类
- 标准卡
- 开源模块
- 自定义模块
readom 模块
1 import random 2 3 print(random.random()) #用于随机生成一个0到1随机浮点数 4 print(random.randint(1,3)) #随机(a,b) 之间的值 1<=n<=3 5 print(random.randrange(1,3)) #随机(a,b) 之间的值,不包含3 1<=n<3 6 print(random.choice('hello')) #随机取('hello')值 单个字符,可传入元祖,列表,字符串 print(random.choice([1,2,3])) 7 print(random.sample('hello',3))#随机取('hello',3) hello的前3位的单个字符 8 print(random.uniform(1,10)) #用于生成制定范围值的一个随机浮点数 9 10 #随机密码-数字&字母组合 11 checkcode = '' 12 for i in range(4): #循环 0,1,2,3 13 current = random.randrange(0,4) # 随机0,1,2,3 14 print(current,i) 15 if current == i: 16 tmp = chr(random.randint(65,90)) #ASCII码 65-90代表A-Z 17 else: 18 tmp = random.randint(0,9) 19 checkcode +=str(tmp) 20 print(checkcode)
os模块
1 import os 2 3 print(os.getcwd())#获取当前工作目录 4 os.chdir("/home") #改变当前路径,相当于cd 5 os.chdir(r'C:\Users') 6 print(os.getcwd()) 7 print(os.curdir)#返回当前目录“.” 8 print(os.pardir)#返回上一级目录“..”当前目录的父目录 9 os.makedirs(r'/Users/chenjianguo/Desktop/charm/python/day05/a/b/c')#创建多层次递归目录 10 os.removedirs(r'/Users/chenjianguo/Desktop/charm/python/day05/a/b/c') #若目录为空,则删除,并递归到上一级目录,以此类推(必须是存在目录) 11 os.mkdir(r'/Users/chenjianguo/Desktop/charm/python/day05/dirmame') #创建目录,不可递归 12 os.rmdir(r'/Users/chenjianguo/Desktop/charm/python/day05/dirmame') #删除单级空目录 13 print(os.listdir(r'/Users')) #列出指定目录下所有文件河子目录,包括隐藏文件,并以列表方式打印 14 os.remove(r'123.py') #删除文件 15 print(os.stat(r'dirmame')) #获取文件/目录-的详细信息 16 print(os.sep) #输出路径分隔符 / 17 print(os.linesep) #输出换行分隔符 18 print(os.pathsep) #输出冒号 : 19 os.system('ls') #执行shell命令 20 print(os.environ) #获取系统环境变量 21 print(os.path.abspath('dirmame'))#:绝对路径 22 print(os.path.split(r'/Users/chenjianguo/Desktop/charm/python/day05/package_test/123.py'))#: 把path分为目录和文件两个部分,以列表返回 23 print(os.path.abspath(__file__)) #返回当前文件的绝对路径 24 print(os.path.dirname(os.path.abspath(__file__))) #返回**的目录 25 print(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) #多次执行返回上一级目录 26 print(os.path.basename(r'123.py')) #获取文件名 27 print(os.path.exists(r'123.py')) #判断文件是否存在,存在返回True 不存在返回False 28 print(os.path.isabs(r'/')) #如果是绝对路径返回True 不是返回False 29 print(os.path.isfile('123.py')) #判断是否是文件是返回True 不是发挥False 30 print(os.path.isdir('dirmame')) #判断是否是目录是返回True 不是发挥False 31 print(os.path.join('dirmame','123'))#: 常用来链接路径 32 os.path.altsep#: 根目录 33 os.path.curdir#:当前目录 34 os.path.pardir#:父目录 35 print(os.path.getatime('dirmame')) #获取指定文件/目录的最后存取时间 36 print(os.path.getmtime('dirmame')) #获取指定文件/目录的最后修改时间
sys模块
1 import sys 2 # print(sys.exit()) #退出程序,正常退出时exit(0) 3 print(sys.version) #获取Python解释程序的版本信息 4 # print(sys.maxint) #最大的Int值 5 print(sys.path) #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 6 print(sys.platform) #返回操作系统平台名称 7 print(sys.stdout.write('please:'))#写进度条 8 val = sys.stdin.readline()[:-1] #获取输入值 9 print(val)
time&datetime模块
time和datetime模块主要用于操作时间
时间有三种表示方式,一种是时间戳、一种是格式化时间、一种是时间元组
1 import datetime, time 2 3 print(time.timezone) # 和标准时间相差的时间,单位是s 4 print(time.time()) # 获取当前时间戳 5 print(time.sleep(1)) # 休息几s 6 print(time.gmtime()) # 把时间戳转换成时间元组,如果不传的话,默认取标准时区的时间戳 7 print(time.localtime()) # 把时间戳转换成时间元组,如果不传的话,默认取当前时区的时间戳 8 print(time.mktime(time.localtime())) # 把时间元组转换成时间戳 9 print(time.strftime("%y%m%d %H%M%S")) # 将时间元组转换成格式化输出的字符串 10 print(time.strptime("20160204 191919", "%Y%m%d %H%M%S")) # 将格式化的时间转换成时间元组 11 print(time.struct_time) # 时间元组 12 print(time.asctime()) # 时间元转换成格式化时间 13 print(time.ctime()) # 时间戳转换成格式化时间 14 print(datetime.datetime.now()) # 当然时间格式化输出 15 print(datetime.datetime.now() + datetime.timedelta(3)) # 3天后的时间 16 print(datetime.datetime.now() + datetime.timedelta(-3)) # 3天前的时间
现在看起来更有希望格式成我们想要的时间了。
time.strftime('%Y-%m-%d',time.localtime(time.time()))
输出日期和时间:
time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
time.strftime里面有很多参数,可以让你能够更随意的输出自己想要的东西:
下面是time.strftime的参数:
strftime(format[, tuple]) -> string
将指定的struct_time(默认为当前时间),根据指定的格式化字符串输出
python中时间日期格式化符号:
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
zipfile&tarfile模块
1 import zipfile 2 # 压缩 3 z = zipfile.ZipFile('laxi.zip', 'w') 4 z.write('a.log') 5 z.write('data.data') 6 z.close() 7 8 # 解压 9 z = zipfile.ZipFile('laxi.zip', 'r') 10 z.extractall() 11 z.close() 12 13 import tarfile 14 15 # 压缩 16 tar = tarfile.open('qunawang-test.zip','w') #压缩包命名 17 tar.add('/Users/chenjianguo/Desktop/charm/python/qunawang', arcname='qunawang1222.zip') #压缩文件目录,arcname->解压后显示的名字 18 tar.add('/Users/chenjianguo/Desktop/charm/python/test/qunawang-test.zip', arcname='cmdb1.zip') 19 tar.close() 20 21 # # # 解压 /Users/chenjianguo/Desktop/charm/python/test/qunawang-test.zip 22 tar = tarfile.open('qunawang-test.zip','r') 23 tar.extractall() # 可设置解压地址 24 tar.close()
xlrd,xlwt,xlutils模块介绍-excel操作
xlrd模块是读取excel
1 import xlrd 2 3 # 打开excel:新建 deme.xls文件,否则会报错 4 file = xlrd.open_workbook('dome.xls') 5 # 查看文件中包含sheet的名称: 6 print(file.sheet_names()) 7 # 得到第一个工作表,或者通过索引顺序 或 工作表名称 8 sheet = file.sheets()[0] 9 # print(sheet) 10 sheet = file.sheet_by_index(1) 11 # print(sheet) 12 sheet = file.sheet_by_name('工作表1') 13 print('sheet:',sheet) 14 # 获取行数和列数 15 nrows = sheet.nrows 16 print('nrows:',nrows) 17 ncols = sheet.ncols 18 print('ncols:',ncols) 19 # 循环行,得到索引的列表 20 for rownum in range(sheet.nrows): 21 print('rownum:',sheet.row_values(rownum)) 22 # 获取整行和整列的值(数组) 23 #sheet.row_values(i) 24 #sheet.col_values(i) 25 # 单元格(索引获取) 26 cell_A1 = sheet.cell(0, 0).value 27 print(cell_A1) 28 cell_C4 = sheet.cell(1, 3).value 29 print(cell_C4) 30 # 分别使用行列索引 31 cell_A1 = sheet.row(0)[0].value 32 print(cell_A1) 33 cell_A2 = sheet.col(1)[0].value 34 print(cell_A2)
xlwt模块是写excel的
1 # 导入xlwt 2 import xlwt 3 4 # 新建一个excel文件 5 file = xlwt.Workbook() # 注意这里的Workbook首字母是大写,无语吧 6 # 新建一个sheet 7 sheet = file.add_sheet('sheet_name',cell_overwrite_ok=True) 8 # 写入数据sheet.write(行,列,value) 9 sheet.write(0, 0, 'test') 10 # 如果对一个单元格重复操作,会引发 11 #returns error: 12 # Exception: Attempt to overwrite cell: 13 # sheetname=u‘sheet 1‘ rowx=0 colx=0 14 # 所以在打开时加cell_overwrite_ok=True解决 15 # sheet = file.add_sheet('sheet name', cell_overwrite_ok=True) 16 # 保存文件 17 file.save('demo111.xls')
xlutils是用来修改excel的
1 from xlrd import open_workbook 2 from xlutils.copy import copy 3 4 rb = open_workbook('demo111.xls') 5 # 通过sheet_by_index()获取的sheet 6 rs = rb.sheet_by_index(0) 7 # 复制一个excel 8 wb = copy(rb) 9 # 通过获取到新的excel里面的sheet页 10 ws = wb.get_sheet(0) 11 ws.write(1, 0, 'Lily') # 写入excel,第一个值是行,第二个值是列 12 wb.save('szz_new.xls') # 保存新的excel,保存excel必须使用后缀名是.xls的,不是能是.xlsx的
Configparser 模块
常见文档格式如下
1 [DEFAULT] 2 ServerAliveInterval = 45 3 Compression = yes 4 CompressionLevel = 9 5 ForwardX11 = yes 6 7 [bitbucket.org] 8 User = hg 9 10 [topsecret.server.com] 11 Port = 50022 12 ForwardX11 = no
新建example.ini 格式文件
1 import configparser 2 #生成一个 configparser对象 3 config = configparser.ConfigParser() 4 5 config['DEFAULT'] = {'ServerAliverInterval':'45', #节点-指定对象 --key valuer 6 'Compression':'yes', 7 'CompersionLevel':'9'} 8 config['bitbucket.org'] = {} #空节点 9 config['bitbucket.org']['User'] = 'hg' 10 11 config['topsecret.server.com'] = {} 12 topsecret = config['topsecret.server.com'] #赋值-方便操作 13 topsecret['Host Port'] = '50022' 14 topsecret['ForwardXll'] = 'no' 15 16 config['DEFAULT']['ForwardXll'] = 'yes' 17 #写入文件 example.ini 18 with open('example.ini','w') as configfile: 19 config.write(configfile)
configparser 读取
1 import configparser 2 3 config = configparser.ConfigParser() 4 config.read('example.ini') #读取文件 5 6 print(config.defaults()) #读取文件头结点 7 print(config['bitbucket.org']['user']) #读取结点下的内容['bitbucket.org']['user'] 8 print(config.sections()) #读取结点
configparser 删除-数据修改
1 import configparser 2 3 config = configparser.ConfigParser() 4 config.read('example.ini') 5 6 secs = config.sections() 7 print(secs) 8 options = config.options('topsecret.server.com') #读取结点 9 print(options) 10 item = config.items('topsecret.server.com') #读取结点内容 11 config.set('bitbucket.org','hg','111') #增加节点下的数据hg=111 12 config.write(open('i.cfg','w')) 13 14 #删除bitbucket.org节点 15 sec = config.add_section('IPADD') #增加节点 16 # sec = config.has_section('IPADD') #删除节点 17 # sec = config.remove_section('bitbucket.org') #删除结点 18 config.remove_option('bitbucket.org','user') #删除结点下的数user数据 19 config.write(open('example.cfg','w'))
hashlib模块
hashlib模块,主要用于加密相关的操作,在python3的版本里,代替了md5和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
1 import hashlib 2 # ######## md5 ######## 3 4 hash = hashlib.md5() 5 hash.update(b'admin') 6 print(hash.hexdigest()) 7 print(hash.digest()) # 2进制格式hash 8 print(len(hash.hexdigest())) # 16进制格式hash 9 10 # ######## sha1 ######## 11 12 hash = hashlib.sha1() 13 hash.update(b'admin') 14 print(hash.hexdigest()) # 16进制格式显示 15 16 # ######## sha256 ######## 17 18 hash = hashlib.sha256() 19 hash.update(b'admin') 20 print(hash.hexdigest()) 21 22 # ######## sha384 ######## 23 24 hash = hashlib.sha384() 25 hash.update(b'admin') 26 print(hash.hexdigest()) 27 28 # ######## sha512 ######## 29 30 hash = hashlib.sha512() 31 hash.update(b'admin') 32 print(hash.hexdigest())
更多关于md5,sha1,sha256等介绍的文章看这里https://www.tbs-certificates.co.uk/FAQ/en/sha256.html
资料补充
re模块- 常用正则表达式符号
1 '.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行 2 '^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE) 3 '$' 匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以 4 '*' 匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 结果为['abb', 'ab', 'a'] 5 '+' 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb'] 6 '?' 匹配前一个字符1次或0次 7 '{m}' 匹配前一个字符m次 8 '{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb'] 9 '|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC' 10 '(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c 11 12 13 '\A' 只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的 14 '\Z' 匹配字符结尾,同$ 15 '\d' 匹配数字0-9 16 '\D' 匹配非数字 17 '\w' 匹配[A-Za-z0-9] 18 '\W' 匹配非[A-Za-z0-9] 19 ‘\s' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t' 20 21 '(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city") 结果{'province': '3714', 'city': '81', 'birthday': '1993'}
最常用的匹配语法
1 re.match 从头开始匹配 2 re.search 匹配包含 3 re.findall 把所有匹配到的字符放到以列表中的元素返回 4 re.splitall 以匹配到的字符当做列表分隔符 5 re.sub 匹配字符并替换
反斜杠的困扰
与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。同样,匹配一个数字的"\\d"可以写成r"\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。
1 import re 2 res = re.match('^chen\d+','chen123jianguo') #^匹配,\d匹配数字,+出现一次或多次 match从头读取 3 print(res.group()) 4 res = re.match('^.+\d','chen123jianguo') #.匹配一个字符 5 print(res.group()) 6 res = re.search('j.+o','chen123jianguo321') #search 读取整个文件 从J开的读取 .+匹配所有字符--到o 结束 7 print(res.group()) 8 res = re.search('j[a-zA-Z]+\d+[A-Za-z]+','chen123jianguo321Jianguo') #[a-z] a到z出现的字符 9 print(res.group()) 10 res = re.search('c?','cchen123jianguo321Jianguo') # ?匹配a出现1次或者0次 ccl ?--> chenccl&cchenccl&cclhenccl =ccl&cc&ccl 11 print(res.group()) 12 res = re.search('[0-9]{3}','chen1jian2guo334aa') #{3} 匹配3个 334 {1,3} 1到3 13 print(res.group()) 14 res = re.findall('[0-9]{1,3}','chen1jian2guo334aa') #findall 查找全部['1', '2', '334'] 没有group方法 只能在命令行执行 15 print(res.group()) 16 res = re.search('abc|ABC','abcABCchen1jian2guo334aa') # |->或 匹配管道符 | 俩边 findall 查找全部 17 print(res.group()) 18 res = re.search('(abc){2}','alexabcabccc') #()组合匹配 (abc)匹配abc 俩次{2} 19 print(res.group()) 20 res = re.search('(abc){2}\|','alexabcabc|cc') # \ -->转译 不把|看做管道符操作abcabc| 21 print(res.group()) 22 res = re.search('(abc){2}(\|\|=){2}','alexabcabc||=||=cc') # \ -->转译 双||都需要转译 23 print(res.group()) 24 res = re.search('\D+','2312# @#@312') # \D 匹配非数字的 特殊字符 \w匹配[A-Za-z0-9] \W匹配非[A-Za-z0-9] 25 print(res.group()) 26 res = re.search('\s+','2312# \r\n@#@312') # 匹配空白字符、\t、\n、\r 命令行展示效果 27 print(res.group()) 28 res = re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242") 29 print(res.groupdict()) #res.groupdict("city") {'province': '3714', 'city': '81', 'birthday': '1993'} 30 res = re.split('[0-9]','abc1ef33ef11') #['abc', 'ef', '', 'ef', '', ''] split分割-命令行执行 31 print(res) 32 res = re.sub('[0-9]+','|','abc1ef33ef11') #sub 替换 'abc|ef|ef|' 命令行执行 33 print(res) 34 res = re.sub('[0-9]+','|','abc1ef33ef11',count=2) #sub 替换 前2个 'abc|ef|ef11' 命令行执行 35 print(res) 36 res = re.search('[a-z]+','abcA',flags=re.I) #re.I忽略大小写 37 print(res.group()) 38 res = re.search(r'.+','abcA\nbcd\nfffd',flags=re.S) #re.M 点任意匹配模式,改变'.'的行为 39 print(res.group()) 40 print(res)
posted on 2018-05-20 14:17 Baylor_Chen 阅读(289) 评论(0) 编辑 收藏 举报