• 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 '.'     默认匹配除
    之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
     2 '^'     匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","
    abc
    eee",flags=re.MULTILINE)
     3 '$'     匹配字符结尾,或e.search("foo$","bfoo
    sdfsf",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 ''    匹配字符结尾,同$
    15 'd'    匹配数字0-9
    16 'D'    匹配非数字
    17 'w'    匹配[A-Za-z0-9]
    18 'W'    匹配非[A-Za-z0-9]
    19 ‘s'     匹配空白字符、	、
    、
     , re.search("s+","ab	c1
    3").group() 结果 '	'
    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('^chend+','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# 
    @#@312') # 匹配空白字符、	、
    、
     命令行展示效果
    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
    bcd
    fffd',flags=re.S) #re.M 点任意匹配模式,改变'.'的行为
    39 print(res.group())
    40 print(res)
  • 相关阅读:
    oracle 各个版本下载地址
    学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记
    mysql5.7安装教程图解
    myeclipse2017 安装包及破解插件的下载
    MyEclipse 2017 ci6 安装反编译插件(本人自己摸索的方法,亲测可行)
    Myeclipse10.7安装git插件并将Java项目上传到码云(github)
    IntelliJ IDEA 下的svn配置及使用的非常详细的图文总结
    IntelliJ IDEA使用教程
    IntelliJ idea 中使用Git
    IntelliJ Idea 集成svn 和使用
  • 原文地址:https://www.cnblogs.com/Baylor-Chen/p/9063324.html
Copyright © 2020-2023  润新知