• python之模块


    模块即一推代码的集合来实现某个功能,使用时直接调用,甚是方便。

    模块又分为三种

    • 自定义模块
    • 内置模块
    • 第三方模块

    下面就来介绍介绍什么是内置模块及如何去使用它和内置模块的好处。

    使用模块模块前首先导入该模块,才能调用到该模块的功能。导入方法

    import 模块名字
    

    先来模块介绍常用的模块

    time模块

     和时间相关的操作,常见几种表现方式

    time.time()时间戳
    time.gmtime()结构化时间
    time.localtime()本地时间
    time.strftime()字符串时间
    time.ctime()
    time.mktime()
    

    常见输出的格式化占位符

    %Y  表示年
    %m 表示月范围 [01,12].
    %d  表示天范围 [01,31].
    %H  表示小时范围 [00,23].
    %M 表示分钟范围 [00,59].
    %S  表示秒范围 [00,61].
    格式化占位符

    random模块

    生成随机数的模块。

    常见几种方法

    import random
    
    print(random.random())
    print(random.randint(1, 2))#左右都包括
    print(random.randrange(1, 10))#包左不包右
    

    最常见的例子就是生成随机验证码

    import random
    temp = ''
    for i in range(4):
        add_num = random.choice([random.randrange(0,10),chr(random.randrange(65,91))])
        temp += str(add_num)
    print(temp)
    第一种
    import random
    temp = ""
    for i in range(4):
        num = random.randrange(0,4)
        if num == 3 or num == 1:
            li = random.randrange(0,10)
            temp = temp + str(li)
        else:
            rad = random.randrange(65,91)
            c = chr(rad)
            temp += c
    print(temp)
    第二种

    sys模块

    主要公共是提供对python解释器的操作

    sys.argv           命令行参数List,第一个元素是程序本身路径
    sys.exit(n)        退出程序,正常退出时exit(0)
    sys.version        获取Python解释程序的版本信息
    sys.maxint         最大的Int值
    sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
    sys.platform       返回操作系统平台名称
    sys.stdin          输入相关
    sys.stdout         输出相关
    sys.stderror       错误相关

    os模块 

    用于提供系统级别的操作

    os.getcwd()                 获取当前工作目录,即当前python脚本工作的目录路径
    os.chdir("dirname")         改变当前脚本工作目录;相当于shell下cd
    os.curdir                   返回当前目录: ('.')
    os.pardir                   获取当前目录的父目录字符串名:('..')
    os.makedirs('dir1/dir2')    可生成多层递归目录
    os.removedirs('dirname1')   若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
    os.mkdir('dirname')         生成单级目录;相当于shell中mkdir dirname
    os.rmdir('dirname')         删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
    os.listdir('dirname')       列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
    os.remove()                 删除一个文件
    os.rename("oldname","new")  重命名文件/目录
    os.stat('path/filename')    获取文件/目录信息
    os.sep                      操作系统特定的路径分隔符,win下为"\",Linux下为"/"
    os.linesep                  当前平台使用的行终止符,win下为"
    ",Linux下为"
    "
    os.pathsep                  用于分割文件路径的字符串
    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所指向的文件或者目录的最后修改时间
    

    hashlib模块

    加密相关的模块

    import hashlib
    print(hashlib.md5())#<md5 HASH object @ 0x0000000000A61940>
    
    m = hashlib.md5()
    m.update("hello world".encode("utf8"))
    print(m.hexdigest())#5eb63bbbe01eeed093cb22bb8f5acdc3
    Md5加密后的结果显示
    
    s = hashlib.sha256()
    s.update("hello world".encode("utf8"))
    print(s.hexdigest())#b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
    加密程度更安全
    
    sha256加密算法虽然比md5的级别程度高,但是运行速度慢
    

    logging模块

    记录日志的信息功能模块,默认有5个等级

    import logging  
    logging.debug('debug message')  
    logging.info('info message')  
    logging.warning('warning message')  
    logging.error('error message')  
    logging.critical('critical message') 
    

    5种日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG ,所以上述只能输出三种情况 

    WARNING:root:warning message
    ERROR:root:error message
    CRITICAL:root:critical message
    

    两种打印日志的格式

    import logging  
    logging.basicConfig(level=logging.DEBUG,  
                        format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',  
                        datefmt='%a, %d %b %Y %H:%M:%S',  
                        filename='/tmp/test.log',  
                        filemode='w')  
      
    logging.debug('debug message')  
    logging.info('info message')  
    logging.warning('warning message')  
    logging.error('error message')  
    logging.critical('critical message')
    打印日志文本
    import logging
    logger = logging.getLogger()
    fh = logging.FileHandler("test.log",encoding="utf-8")
    ch = logging.StreamHandler()
    formatter = logging.Formatter("%(asctime)s -%(name)s - %(levelname)s - %(message)s")
    
    fh.setFormatter(formatter)
    ch.setFormatter(formatter)
    logger.addHandler(fh)
    logger.addHandler(ch)
    
    logger.setLevel(logging.DEBUG)
    logging.debug("debug message")
    logging.info("info message")
    logging.warning("warning messing")
    logging.error("error message")
    logging.critical("critical message")
    屏幕和日志文本中

    从上述可见,参数的表示意义为(如果更改就会报错,但可以根据自己需求选择其中几个显示打印出来)

    • filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。
    • filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
    • format:指定handler使用的日志显示格式。 
    • datefmt:指定日期时间格式。 
    • level:设置rootlogger(后边会讲解具体概念)的日志级别 
    • stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。

    对format中涉及的参数意义

    • %(name)s Logger的名字
    • %(levelno)s 数字形式的日志级别
    • %(levelname)s 文本形式的日志级别
    • %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
    • %(filename)s 调用日志输出函数的模块的文件名
    • %(module)s 调用日志输出函数的模块名
    • %(funcName)s 调用日志输出函数的函数名
    • %(lineno)d 调用日志输出函数的语句所在的代码行
    • %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
    • %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
    • %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
    • %(thread)d 线程ID。可能没有
    • %(threadName)s 线程名。可能没有
    • %(process)d 进程ID。可能没有
    • %(message)s用户输出的消息

    re模块

    即正则表达式。我们知道在许多代码中如果要自己查找费事还不容易对,所以我们引入了正则进行模糊匹配。之前我们学习了字符串也能进行匹配查找,但是string提供的是完全匹配。不方便查找更多元素。

    正则提供一种紧凑的表示法,可用于表示字符串的组合,之所以如此强大,是因为单独的正则表达式可以表示无限数量的字符串,只要满足正则规则即可。

    常见的正则的5种用途

    • 分析:识别并提取符合特定标准的的文本
    • 搜索:定位可以有不止一种形式的字符串。
    • 搜索与替代:使用一个字符串对与正则匹配的对象进行替代。
    • 字符串分割:在与正则匹配的地方对字符串进行分割。
    • 验证:检测某段文本是否符合某些功能。

     常用元字符

    . ^ $ * + ? { } [ ] | ( )

    . 通配符表示:能匹配一个字符re.findall("alex.f","yinfansfksdfalexfadf")
    ^ 尖角符表示: 只能匹配到的字符在首位re.findall("^alex","alexyinfansfksdffadf")
    $ 表示:只能匹配到的字符在末尾re.findall("alex$","yinfansfksdffadfalex")
    * 重复匹配表示:匹配*前一位字符0次到多次a = re.findall("alex*","alexxxx")
    + 表示:匹配+前一位字符1次到多次a = re.findall("alex*","alexxxx)
    ? 表示:匹配?前一位字符0次到1次a = re.findall("alex?","alexxxx)
    {}表示:想匹配几次就几次 a = re.findall("alex{3}","alexxx")
           {m} 匹配m次
           {m,n}匹配m到n次
           {1,}表示1到正无穷大
    [] 字符集表示:匹配[]里的字符中的一个re.findall("a[bc]d","wwwwacd")
           如果是[a-z]则表示匹配任意字符
           [^0-9]表示匹配非数字以外的字符
     表示:后边跟元字符去除特殊功能
           后边跟普通字符实现特殊功能
           引用序号对应的字组所匹配的字符串
           d 匹配任何十进制数:相当于类 [0-9]
           D 匹配任何非数字字符:相当于类[^0-9]
           s 匹配任何空白字符:相当于类[	
    f
    v]
           S 匹配任何非空白字符:相当于类[^	
    f
    v]
           w 匹配任何字母数字字符:相当于类[a-zA-Z0-9]
           W 匹配任何非字母数字字符:相当于类[^a-zA-Z0-9]
            匹配一个特殊字符边界,也就是指单词和空格间的位置
    ()表示:做一个整体去匹配
    | 表示:或的意思
    

    常见方法

    findall()所有结果都返回到一个列表里
    search()返回一个对象,对象可以调用group()找到返回结果,只匹配第一个
    match()只在字符串开始匹配,也只返回一个对象,用group()找到返回结果
    split()分割re.split("[k,s]","djkgsal")#['dj','g','al']
    sub()替换re.sub("a..b","affasff","saffbfs")
    compile()#obj =re.compile("fa") 调用 obj.findall("afafsdff")
    

    注:

    • re.I 表示对大小写不敏感
    • re.L 做本地化识别匹配
    • re.M 多行匹配,影响^ 和 $
    • re.S 使 . 匹配包括换行在内的所有字符

    例如取多层运算最里层的括号的方法

    import re
    
    a = re.search("([^()]*)","1-2*((60-30+(-9-2-5-2*3-5/3-40*4/2-3/5+6*3)*(-9-2-2*5/3 +7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*25))").group()
    print(a)
    
    输出结果
    (-9-2-5-2*3-5/3-40*4/2-3/5+6*3)
    

      

    import re
    ret = re.findall('(?P<name>w{2})/(?P<age>d{2})',"45bd/34"ab"3")
    

    json,pickle模块

    主要用于序列化

    • json     用于【字符串】和 【python基本数据类型】 间进行转换
    • pickle   用于【python特有的类型】 和 【python基本数据类型】间进行转换

     它们都提供了4个功能 dump,dumps,写入  load,loads 导出

    import json
    dic = {"name":"flash","age":19}
    date = json.dumps(dic)
    with open("jsosn_text","w") as f:
        f.write(date)
    date = json.dumps(dic)
    
    with open("json_text2","w") as f:
        json.dump(dic,f)
    
    
    with open("jsosn_text","r") as f:
        date = json.load(f)
    print(date)
    

    xml模块  

    XML是实现不同语言或程序之间进行数据交换的协议,XML文件格式如下 

    <data>
        <country name="Liechtenstein">
            <rank updated="yes">2</rank>
            <year>2023</year>
            <gdppc>141100</gdppc>
            <neighbor direction="E" name="Austria" />
            <neighbor direction="W" name="Switzerland" />
        </country>
        <country name="Singapore">
            <rank updated="yes">5</rank>
            <year>2026</year>
            <gdppc>59900</gdppc>
            <neighbor direction="N" name="Malaysia" />
        </country>
        <country name="Panama">
            <rank updated="yes">69</rank>
            <year>2026</year>
            <gdppc>13600</gdppc>
            <neighbor direction="W" name="Costa Rica" />
            <neighbor direction="E" name="Colombia" />
        </country>
    </data>
    创建
    from xml.etree import ElementTree as ET
    
    ############ 解析方式一 ############
    
    # 打开文件,读取XML内容
    str_xml = open('xo.xml', 'r').read()
    
    # 将字符串解析成xml特殊对象,root代指xml文件的根节点
    root = ET.XML(str_xml)
    
    ############ 操作 ############
    
    # 顶层标签
    print(root.tag)
    
    # 循环所有的year节点
    for node in root.iter('year'):
        # 将year节点中的内容自增一
        new_year = int(node.text) + 1
        node.text = str(new_year)
    
        # 设置属性
        node.set('name', 'alex')
        node.set('age', '18')
        # 删除属性
        del node.attrib['name']
    
    
    ############ 保存文件 ############
    tree = ET.ElementTree(root)
    tree.write("newnew.xml", encoding='utf-8')
    字符串修改保存
    from xml.etree import ElementTree as ET
    
    ############ 解析方式二 ############
    
    # 直接解析xml文件
    tree = ET.parse("xo.xml")
    
    # 获取xml文件的根节点
    root = tree.getroot()
    
    ############ 操作 ############
    
    # 顶层标签
    print(root.tag)
    
    # 循环所有的year节点
    for node in root.iter('year'):
        # 将year节点中的内容自增一
        new_year = int(node.text) + 1
        node.text = str(new_year)
    
        # 设置属性
        node.set('name', 'alex')
        node.set('age', '18')
        # 删除属性
        del node.attrib['name']
    
    
    ############ 保存文件 ############
    tree.write("newnew.xml", encoding='utf-8')
    
    解析文件方式,修改,保存
    文件修改保存
    from xml.etree import ElementTree as ET
    
    ############ 解析字符串方式打开 ############
    
    # 打开文件,读取XML内容
    str_xml = open('xo.xml', 'r').read()
    
    # 将字符串解析成xml特殊对象,root代指xml文件的根节点
    root = ET.XML(str_xml)
    
    ############ 操作 ############
    
    # 顶层标签
    print(root.tag)
    
    # 遍历data下的所有country节点
    for country in root.findall('country'):
        # 获取每一个country节点下rank节点的内容
        rank = int(country.find('rank').text)
    
        if rank > 50:
            # 删除指定country节点
            root.remove(country)
    
    ############ 保存文件 ############
    tree = ET.ElementTree(root)
    tree.write("newnew.xml", encoding='utf-8')
    字符串删除保存
    from xml.etree import ElementTree as ET
    
    ############ 解析文件方式 ############
    
    # 直接解析xml文件
    tree = ET.parse("xo.xml")
    
    # 获取xml文件的根节点
    root = tree.getroot()
    
    ############ 操作 ############
    
    # 顶层标签
    print(root.tag)
    
    # 遍历data下的所有country节点
    for country in root.findall('country'):
        # 获取每一个country节点下rank节点的内容
        rank = int(country.find('rank').text)
    
        if rank > 50:
            # 删除指定country节点
            root.remove(country)
    
    ############ 保存文件 ############
    tree.write("newnew.xml", encoding='utf-8')
    文件删除保存
    from xml.etree import ElementTree as ET
    
    
    # 创建根节点
    root = ET.Element("famliy")
    
    
    # 创建节点大儿子
    son1 = ET.Element('son', {'name': '儿1'})
    # 创建小儿子
    son2 = ET.Element('son', {"name": '儿2'})
    
    # 在大儿子中创建两个孙子
    grandson1 = ET.Element('grandson', {'name': '儿11'})
    grandson2 = ET.Element('grandson', {'name': '儿12'})
    son1.append(grandson1)
    son1.append(grandson2)
    
    
    # 把儿子添加到根节点中
    root.append(son1)
    root.append(son1)
    
    tree = ET.ElementTree(root)
    tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False)
    创建

     

      

     

  • 相关阅读:
    java开发:分享一下百度ueditor和七牛的图片集成上传
    java开发:分享一下使用urlrewrite实现网址的个性访问
    javascript应用:页面解析list和map封装后的json数据
    JAVA开发:分享一些SpringMvc+Ibatis+spring的框架使用心得
    使用OLEDB读取excel和csv文件
    静态代码块、构造代码块
    序列化和反序列化
    windows下Mysql5.7.10免安装版配置
    form表单中的encType属性
    关于字符编码,你所需要知道的(ASCII,Unicode,Utf-8,GB2312…)
  • 原文地址:https://www.cnblogs.com/flash55/p/5856421.html
Copyright © 2020-2023  润新知