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代码中,从而实现代码的复用

注意

  1. 如果是本地导入文件,直接使用:import filename
  2. 如果导入的是一个包,该包下面必须是有__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  阅读(285)  评论(0编辑  收藏  举报

导航