第三章 模块

第三章 模块

  1. 模块定义

    定义:可以把一个py文件或一个包、类库当做一个模块,方便以后其他py文件使用,模块可以是py文件,也可以是文件夹,创建文件夹中要有一个e__itin__.py(空)文件

  2. 内置模块

    定义:python内部提供的功能

    2.1 random

      生成随机数:import random   random.randint(起始,终止)

    2.2 hashib

import hashlib
obj = hashlib.md5()
obj.update('123'.encode('utf-8'))    #把字符串进行转码才能用,py2不报错,py3报错,需要进行再次编码
result = obj.hexdingest()

#加盐
import hashlib
def get_md5(data):
    obj = hashlib.md5('qwe').encode('utf-8')    #让自己的密码加上这个字符串
    obj.update(data.encode('utf-8'))
    return obj.hexdigest()
val = get_md5('123')

     2.3 os(操作系统相关数据)

      os.makedirs:创建单级或者多级目录

      os.path.exists('路径'):判断该路径是否存在,返回布尔值

      os.rename('原来的name','现在的name'):重命名

      os.path.dirname(path):寻找上级目录

      os.path.join(第一个路径,第二个路径):路径拼接

      os.listdir(path):查看当前目录下所有的文件(第一层)

      os.walk(path):查看目录下的所有文件所有层(正在查看的目录,此目录下的文件夹,此目录下的文件)

      os.path.basename(file_path):在一个文件路径中获取文件名

     2.4 sys

      sys.argv:模块传参,获取用户执行脚本时,传入的参数

      sysexit(0/1):终止程序,0表示正常终止

      sys.path:python默认模块路径

      sys.path.append:可以增加自己指定的路径为默认路径

     2.5 json

      定义:一个特殊的字符串,向列表/字典/字符串/数字/真假的嵌套,元组则强制转换成列表,集合报错

      序列化:把数据类型相关换成json字符串。与其他语言相互传送消息时用json

      反序列换:把json的字符串变成python列表/字典·······成为反序列化

      注:在序列化字符串时,必须用双引号

#序列化
import json
v = [1,2,3]
v1 = json.dumps(v)
print(v1)    

#反序列化
v2 = '["alex",123]'
v3 = json.loads(v2)
print(v3)

#简单的爬虫
import json
import requests
response = requests.get('http://www.baidu.com")
data = json.loads(response.text)
print(data)

     2.6 time/datetime

      time.time():时间戳1970年1月1鈤00:00开始到现在经过了多少秒

      time.sleep():等待几秒

      datetime.now():获取当前本地时间

      datetime.now().strftime('%Y-%m-%d-%H-%M-%S'):将datetime模式转换成字符串格式

      v1 = datetime.strptime('2011-11-11','%Y-%m-%d')    #字符串转tatetime,输入时间要和格式对应

        v2 = v1+ / - timedelta(day=40)    #当前时间加减40天,必须是datetime格式

     2.7 shutil

      shutil.rmtree(path):删除文件

      shutil.move():重命名

      shutilmake_archive('xxx','zip','目录'):把这个目录打包成xxx.zip压缩文件

      shutil.unpack_archive('xxx.zip',extract_dir = 'd:\code','format='zip':把文件xxx.zip解压到d下的code(目录不存在则创建,不加目录则默认当前位置)

     2.8 logging

      日志处理本质:Logger/FileHandler/Formatter

      logging内容:NOTSET = 0  (不设置)

             DEBUG = 10  (调试)

             INFP = 20  (正常信息)

             WAEN = WARNING = 30  (警告:不会报错,大于警告进日志)

             ERROR = 40  (错误)

             CRITICAL = 50  (严重错误)

      注:当上面有一个配置文件时,后面的配置文件无效

#日志模块处理的本质
import logging
file_handler1 = logging.FileHandler('x1.log', 'a', encoding='utf-8')
fmt1 = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s")
file_handler1.setFormatter(fmt1)

file_handler2 = logging.FileHandler('x2.log', 'a', encoding='utf-8')
fmt2 = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s")
file_handler2.setFormatter(fmt1)

logger = logging.Logger('xxx', level=logging.ERROR)    #xxx只是对象名,log中显示,无实际作用
logger.addHandler(file_handler1)
logger.addHandler(file_handler2)    #可以同时写入两个不同的日志文件但不常用
logger.error('你好')

#推荐日志方式
import logging
file_handler = ligging.FileHandler(filename='x1.log',mode='a',encoding='utf-8',)
logging.basicConfig(
    format = '%(asctime)s - %(name)s - %(levelname)s - %(module)s:%(message)s',
    datefmt = '%Y-^m-%d %H:%M:%S %p',
    gandle=[file_handler,],
    level = logging.ERROR
)
logging.errer('你好')

#按照时间切割日志
import time
import logging
from logging import handlers
file_hadler = handlers.TimedRotatingFileHandler(filename = 'x3.log',when = 's' ,interval=5,encoding='utf-8')    #每隔5s写入一次日志
loging.basicConfig(
    format='%(asctime)s - %(levenlname)s - %(module)s:%(message)s',
    datefmt = '%Y-%m-%d %H:%M:%S %p',
    handlers = [file_handler,],
    level = logging.ERROR
)
for i in range(1,100000):
    time.sleep(1)
    logging.error(str(i))

#注意事项
import logging
import requests
logging.basicConfig(
    filename = wf.log',
    format='%(asctime)s - #(name)s - %(levelname)s - %(module)s:%(message)s',
    datefmt = '%Y-%m-%d %H:%H:%M:%S %p',
    level = logging.ERROR
)
try:
    requests.get('http://www.baidu.com')
except Exception as e:
    msg = str(e)    #调用e.__str__方法
    logging.error(msg,exc_info=True)    #exc_info=True会把包括具体哪一行出错也会写入

     2.9 re

      定义:是一种匹配字符串的规则

      元字符:\d:表示所有的数字  \w:表示大小写字符数字下划线  \s:表示匹配所有的空格换行符和制表符  \t:制表符  \D:表示所有的非数字

          \W:表示除数字、字母、下划线之外的所有字符  \S:表示匹配所有除空格换行符和制表符  [\d\D][\W\w][\S\s]表示匹配所有  .:表示出了换行符任意内容

          []:表示在中括号内所有字符都是符合规则的字符  [^]:表示非字符组只要在括号内的所有字符都是不符合规则的字符  ^:表示一个字符的开始并只匹配第一个

          $:表示一个字符的结束并只匹配最后一个  |:表示或,如果两个规则有重叠部分则长的在前,如果|在括号内则只在括号内选中

      元组:{n}:表示只能出现n次  {n,}:表示至少出现n次  {n,m}:表示至少出现n次,最多出现m次  

         ?:匹配0次或1次,最多一个  +:表示匹配1次或多次  *:表示匹配0次或多次

      默认贪婪模式:总是会在符合量词条件的范围内尽量多匹配

      非贪婪(惰性)模式:总是匹配符合条件范围内尽量小的字符串

                在量词后加?  \d{2,5}?(只取两次)

                元字符 量词 ? x  .*?x(匹配任意的内容任意多次,遇到x就立即停止)

      相关模块:

#re.findall
ret = re.findall(规则,需要匹配的东西)
print(ret)    #得出一个列表,匹配不上返回空列表

#re.search
ret = re.search(规则,需要匹配的东西)
print(ret)    得到一个ret对象匹配不上返回None
print(ret.group())    #从头到尾从带匹配的字符串中取出第一个符合条件的项,如果不能匹配则该对象不能实现group方法所以报错,可以加if ret

#re.match
re.match(规则,需要匹配的东西)    #只能从头开始匹配,相当于默认加^

#时间复杂度,重视效率,在同一个正则重复使用多次的时候能减少时间的开销
ret = re.compile(规则)
print(ret)    #得到“recompile(规则)”
r1 = ret.search('Parallel')
print(r1)    #得出匹配

#空间复杂度,内存占用率,在查询的结果超过1隔得情况下,能够有效的节省内存,降低空间复杂度,从而也降低了时间复杂度
ret1 = re.finiditer(规则,需要匹配的东西)
print(ret1)    #得到一个迭代器
for i in ret1:
    print(i)
ret2 = re.compile(规则)
r2 = ret2.finditer(需要匹配的东西)
for i in r2:
    print(i.group())

#re.split
ret = split(规则,匹配内容)
print(ret)    #得到一个列表,根据规则切割匹配内容,切割后匹配内容消失

#re.sub
ret = re.sub('\d','\D','匹配内容')
print(ret)    #把规则中的\d替换成\D输出成列表

      python中的方法+正则表达式的新内容

#分组
import re
ret = re.findall('\d(\d)','匹配内容')    #findall遇到正则表达式中分组(),会优先显示分组中的内容
ret = re.findall('d(?:\d)','匹配内容')    #?:表示取消分组优先显示

#分组命名
命名:(?P<名字>正则表达式)
调用:search group('组名')
import re
s1 = '<h1>Parallel</h1>
ret = re.search('<(?P<name1>\w>(?P<name2>.*?)</\w+>',s1)
print(ret.group(0)    #匹配s1中所有
print(ret.group(name1))    #匹配name1中的内容
print(ret.group(name2))    #匹配name2中的内容

#引用分组表示这个组中的内容必须完全和之前已经存在的组匹配到的内容一模一样
import re
s1 = '<h1>Parallel</h1>'
ret = research(?P<name1>\w+)>(?P<name2>.*?)</(?P=name1)>','s1')    #表示最后一个name1引用name1分组
#三级菜单递归
def menu_func(menu):
    while True:
        for key in menu:
            print(key)
        addr = input('>>>').strip()
        if inp.upper() == 'Q': return 'q'
        if inp.upper() == 'B': return 'b'
        if menu.get(inp):
            flag =  menu_func(menu[inp])    #把得到的东西再输入字典的值
            if flag =='q': return 'q'
    
#三级菜单栈
lst = [menu]
while lst:
    for key in lst[-1]:
        print(key)
    input = input('>>>')
    if inp.upper() =='Q':break
    elif inp.upper() == 'B':lst.pop()
    elif lst[-1].get(inp):
        lst.append(lst[-1][inp])

#listdir求文件夹所有内容大小
import os
lst = [r'D:\code']
size = 0
while lst:
    path = lst.pop()
    name_lst = os.listdir(path)
    for name in name_lst:
        full_path = os.path.join(path,name)
        if os.path.isdir(full_path):
            lst.append(full_path)
        elif os.path.isfile(full_path):
            size += os.path.getsize(full_path)
View Code

  3. 第三方模块

    先下载后,安装使用,python安装路径为Scipts/pip.exe

    查询网址:http://pypi.org

    cmd中:目录/pip.exe install xxx

    注:如果改过python文件名字则会报错,需要执行python3 -m pip install -upgrade pip  重新下载pip

  4. 自定义模块

    自己写的py文件,在另外的py文件import模块名字便可以使用,推荐放在同一目录中

  5. 模块的调用

    导入模块:

        调用py文件:import模块  模块.函数()

              from模块import函数  函数()     (注:后面加*表示所有,会有模块函数名和本地函数名冲突的状况)

              from模块import函数 as别名  别名()

        调用包:import包中的文件  包.模块.函数()

            from包import模块  模块.函数()

        注:模块重复导入不会起作用:import jd  import jd(已经加载过不会再加载)

          如果要重新加载起作用:import importlib  import jd  importlib.reload(jd)

posted @ 2019-05-25 10:50  现实没有如果  阅读(195)  评论(0编辑  收藏  举报