• python基础---->常用模块


    一、前言:

    模块:用一部分代码实现了某个功能的代码集合,类似于函数式编程,定义一个函数完成某个功能呢,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成;

    模块分为三种:自定义模块、第三方模块、内置模块

    二、sys模块

    用于提供对Python解释器相关的操作:

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

    三、os模块

    用于提供系统级别的操作:

     1 os.getcwd()                 获取当前工作目录,即当前python脚本工作的目录路径
     2 os.chdir("dirname")         改变当前脚本工作目录;相当于shell下cd
     3 os.curdir                   返回当前目录: ('.')
     4 os.pardir                   获取当前目录的父目录字符串名:('..')
     5 os.makedirs('dir1/dir2')    可生成多层递归目录
     6 os.removedirs('dirname1')   若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
     7 os.mkdir('dirname')         生成单级目录;相当于shell中mkdir dirname
     8 os.rmdir('dirname')         删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
     9 os.listdir('dirname')       列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
    10 os.remove()                 删除一个文件
    11 os.rename("oldname","new")  重命名文件/目录
    12 os.stat('path/filename')    获取文件/目录信息
    13 os.sep                      操作系统特定的路径分隔符,win下为"\",Linux下为"/"
    14 os.linesep                  当前平台使用的行终止符,win下为"	
    ",Linux下为"
    "
    15 os.pathsep                  用于分割文件路径的字符串
    16 os.name                     字符串指示当前使用平台。win->'nt'; Linux->'posix'
    17 os.system("bash command")   运行shell命令,直接显示
    18 os.environ                  获取系统环境变量
    19 os.path.abspath(path)       返回path规范化的绝对路径
    20 os.path.split(path)         将path分割成目录和文件名二元组返回
    21 os.path.dirname(path)       返回path的目录。其实就是os.path.split(path)的第一个元素
    22 os.path.basename(path)      返回path最后的文件名。如何path以/或结尾,那么就会返回空值。即os.path.split(path)的第二个元素
    23 os.path.exists(path)        如果path存在,返回True;如果path不存在,返回False
    24 os.path.isabs(path)         如果path是绝对路径,返回True
    25 os.path.isfile(path)        如果path是一个存在的文件,返回True。否则返回False
    26 os.path.isdir(path)         如果path是一个存在的目录,则返回True。否则返回False
    27 os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
    28 os.path.getatime(path)      返回path所指向的文件或者目录的最后存取时间
    29 os.path.getmtime(path)      返回path所指向的文件或者目录的最后修改时间

    四、time模块

    常用表示时间方式: 时间戳,格式化的时间字符串,元组(struct_time)

    # struct_time转换成format_time
    
    %a    本地(locale)简化星期名称
    %A    本地完整星期名称
    %b    本地简化月份名称
    %B    本地完整月份名称
    %c    本地相应的日期和时间表示
    %d    一个月中的第几天(01 - 31%H    一天中的第几个小时(24小时制,00 - 23%I    第几个小时(12小时制,01 - 12%j    一年中的第几天(001 - 366%m    月份(01 - 12%M    分钟数(00 - 59%p    本地am或者pm的相应符    一
    %S    秒(01 - 61)    二
    %U    一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天之前的所有天数都放在第0周。
    %w    一个星期中的第几天(0 - 6,0是星期天)    三
    %W    和%U基本相同,不同的是%W以星期一为一个星期的开始。
    %x    本地相应日期
    %X    本地相应时间
    %y    去掉世纪的年份(00 - 99%Y    完整的年份
    %Z    时区的名字(如果不存在为空字符)
    %%    ‘%’字符

    实例:结合sys,time模块实现进度条

    进度百分比
    import sys
    import time
    
    
    def view_bar(num, total):
        rate = float(num) / float(total)
        rate_num = int(rate * 100)
        r = '
    %d%%' % (rate_num, )
        sys.stdout.write(r)
        sys.stdout.flush()
    
    
    if __name__ == '__main__':
        for i in range(0, 100):
            time.sleep(0.1)
            view_bar(i, 100)

    五、random模块

    random.random()    # 0~1 随机浮点数
    random.randint(1,100)   #随机整数1~100
    random.randrange(1,7)   #随机整数,不包括7
    random.choice('hello world')   #随机获取一个字符
    random.choice(['1','2','3',])    #随机获取一个元素
    random.sample([1,2,3,4,5],3) #random.sample的函数原型为:random.sample(sequence, k)从指定序列中随机获取指定长度的片

    实例:生成随机验证码

    版本一:

    import random
    def check_code():
        check_code = ""
        for i in range(4):
            num = random.randint(0,9)             #随机选择0~9
            A1Z1 = chr(random.randint(65,90))     #随机选择A~Z
            a1z1 = chr(random.randint(97,122))    #随机选择a~z
            add = random.choice([num,A1Z1,a1z1])  #随机选择其中一个
            check_code = "".join([code,str(add)])       #拼接一次选到的元素
        return check_code                               #返回验证码#
    print(check_code())

    版本二:

    import random
    checkcode = ''
    for i in range(4):
        current = random.randrange(0,4)
        if current != i:
            temp = chr(random.randint(65,90))
        else:
            temp = random.randint(0,9)
        checkcode += str(temp)
    print checkcode

    五、re模块

     python中re模块提供了正则表达式相关操作

    1     次数:
    2     *     重复零次或更多次
    3     +     重复一次或更多次
    4    ?        重复零次或一次
    5     {n}    重复n次
    6    {n,}    重复n次或更多次
    7    {n,m}    重复n到m次

    其中提供的方法有:

    match、search、findall、sub、split

    import re
    #1
    print(re.findall('e','clint love you') )   #['e', 'e'],返回所有满足匹配条件的结果,放在列表里
    #2
    print(re.search('e','clint love you').group()) #e,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
    
    #3
    print(re.match('e','clint love you'))    #None,同search,不过在字符串开始处进行匹配,完全可以用search+^代替match
    
    #4
    print(re.split('[ab]','abcd'))     #['', '', 'cd'],先按'a'分割得到''和'bcd',再对''和'bcd'分别按'b'分割
    
    #5
    print('===>',re.sub('c','C','clint love you')) #===> Clint love you,不指定n,默认替换所有
    print('===>',re.sub('l','L','clint love you',1)) #===> cLint love you
    print('===>',re.subn('c','C','clint love you')) #===> ('Alex mAke love', 2),结果带有总共替换的个数
    
    #6
    obj=re.compile('d{2}')
    
    print(obj.search('abc123eeee').group()) #12
    print(obj.findall('abc123eeee')) #['12'],重用了obj

     几个匹配的实用例子:

    # 邮箱表达式
    email = r'^[a-aA-Z0-9_-]+@[a-aA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$'
    # 例如:
    # clint1801@163.com
    # 472400995@qq.com
    # s180231943@stu.cqupt.edu.cn   企业邮箱
    '''
    你会发现 后面 . 这是什么意思?
     因为  . 表示匹配任意除换行符"
    "外的字符,而我们要匹配邮箱中的 .  
     所以 需要用到     表示转义字符
     注:
    
        小括号():匹配小括号内的字符串
        中括号[]:匹配字符组内的字符
        大括号{}:匹配的次数
    '''
    邮箱 表达式
    # 手机号表达式
    phone = r'^1[3578]d{9}$'
    手机号 表达式

    IP的正则表达式:

    这里讲的是IPv4的地址格式,总长度 32位=4段*8位,每段之间用 . 分割, 每段都是0-255之间的十进制数值。

    将0-255用正则表达式表示,可以分成一下几块来分别考虑:

    IP地址格式可表示为:XXX.XXX.XXX.XXX,XXX取值范围是0-255,前三段加一个.重复了三次,再与最后一段合并 或者 前一段与加 . 重复三次的后三段合并,组成IP地址的完整格式。

    # IP地址 正则表达如下:
    
    一、
    ip =r'^((25[0-5]|2[0-4]d|((1d{2})|([1-9]?d))).){3}(25[0-5]|2[0-4]d|((1d{2})|([1-9]?d)))$'
    
    二、
    ip = r'^(25[0-5]|2[0-4]d|[0-1]?d?d)(.(25[0-5]|2[0-4]d|[0-1]?d?d)){3}$'

    六、shutil模块

    高级的 文件、文件夹、压缩包 处理模块

    shutil.copyfileobj(fsrc, fdst[, length])       将文件内容拷贝到另一个文件中

    import shutil
     
    shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))

    shutil.copyfile(src, dst)        拷贝文件

    shutil.copyfile('f1.log', 'f2.log')

    shutil.copymode(src, dst)    仅拷贝权限。内容、组、用户均不变

    shutil.copymode('f1.log', 'f2.log')

    shutil.copystat(src, dst)    仅拷贝状态的信息,包括:mode bits, atime, mtime, flags

    shutil.copymode('f1.log', 'f2.log')

    shutil.copy(src, dst)    拷贝文件和权限

    shutil.copymode('f1.log', 'f2.log')

    shutil.copy2(src, dst)    拷贝文件和状态信息

    shutil.copy2('f1.log', 'f2.log')

    shutil.ignore_patterns(*patterns)
    shutil.copytree(src, dst, symlinks=False, ignore=None)      递归的去拷贝文件夹

    shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))

    shutil.rmtree(path[, ignore_errors[, onerror]])    递归的去删除文件

    shutil.rmtree('folder1')

     shutil.move(src, dst)

    递归的去移动文件,它类似mv命令,其实就是重命名。

    shutil.make_archive(base_name, format,...)

    创建压缩包并返回文件路径,例如:zip、tar

    创建压缩包并返回文件路径,例如:zip、tar

    # 将 /DjangoProJ/a/test 下的文件打包放置当前程序目录
    import shutil
    ret = shutil.make_archive("cc", 'gztar', root_dir='/DjangoProJ/a/test')
      
      
    # 将 /DjangoProJ/a/test 下的文件打包放置 /DjangoProJ/a/目录
    import shutil
    ret = shutil.make_archive("/DjangoProJ/a/cc", 'gztar', root_dir='/DjangoProJ/a/test ')

    七、hashlib模块

    用于加密相关的操作,代替了md5模块和sha模块,主要提供 sha1, sha224, sha256, sha384, sha512, blake2b, blake2s和MD5等;

    特点:

    1.内容相同则hash运算结果相同,内容改变则hash值则改变

    2.不可逆推

    3.相同算法:无论校验多长的数据,得到的哈希值长度固定。

    import hashlib
     
    # ######## md5 ########
     
    hash = hashlib.md5(bytes('898oaFs09f',encoding="utf-8"))
    hash.update(bytes('admin',encoding="utf-8"))
    print(hash.hexdigest())

    八、json和pickle模块

    前言

    什么是序列化?

    我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化

    为什么要序列化?

    持久保存状态:

      '状态'会以各种有结构的数据类型形式被保存在内存中;

      内存是无法永久保存数据的,程序运行了一段时间,断电或者重启内存则会清空程序这段段时间保存的数据;

      在断电或重启程序之前将程序当前内存中所有的数据都保存下来(保存到文件中),下次程序执行能够从文件中载入之前的数据继续执行,这就是序列化。

    跨平台数据交互:

      序列化之后,不仅可以把序列化后的内容写入磁盘,还可以通过网络传输到别的机器上,如果收发的双方约定好实用一种序列化的格式,那么打破了平台/语言差异化带来的限制,实现了跨平台数据交互。

      把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling;

    Python中用于序列化的两个模块:json(用于【字符串】和 【python基本数据类型】 间进行转换)、pickle(用于【python特有的类型】 和 【python基本数据类型】间进行转换)

    Json有四个功能:dumps、dump、loads、load

    pickle也有四个功能:dumps、dump、loads、load

    json使用:

    import json
      dic={'name':'clint','age':18,'sex':''}
    print(type(dic))    #<class 'dict'>
      j=json.dumps(dic)
    print(type(j))      #<class 'str'>
    
    f=open('序列化对象','w')
    json.dump(dic,f)
    f.close()

    序列化和反序列化

    import json
    
    # 序列化
    info = {'name':'clint','age':'18'}
    
    with open('a','w') as f:
        f.write(json.dumps(info))
    
    # 反序列化
    with open('a','r') as f:
        info = json.loads(f.read())
        print(info)

    pickle使用:

    import pickle
     dic={'name':'clint','age':18,'sex':''}
     print(type(dic))    #<class 'dict'>
     j=pickle.dumps(dic)
     print(type(j))       #<class 'bytes'>
    
    f=open('序列化对象_pickle','wb') #wb是写入bytes,j是'bytes'
    pickle.dump(dic,f)
    f.close()
    
    
    # 反序列化
    import pickle
    f=open('序列化对象_pickle','rb')
    data=pickle.loads(f.read())    # 等data=pickle.load(f)
    print(data['age'])

    九、configparser模块

    configparser用于生成和修改常见配置文档,其本质上是利用open来操作文件

    1、获取所有节点

    import configparser
     
    config = configparser.ConfigParser()
    config.read('xxxooo', encoding='utf-8')
    ret = config.sections()
    print(ret)

    2、获取指定节点所有键值对

    import configparser
     
    config = configparser.ConfigParser()
    config.read('xxxooo', encoding='utf-8')
    ret = config.items('section1')
    print(ret)

    3、获取指定节点下所有键

    import configparser
     
    config = configparser.ConfigParser()
    config.read('xxxooo', encoding='utf-8')
    ret = config.options('section1')
    print(ret)

    4、增删改查节点

    import configparser
    
    config = configparser.ConfigParser()
    config.read('example.ini',encoding = 'utf-8')
    
    #删除整个标题
    config.remove_section('bitbucket.org')
    
    #删除标题下的option
    config.remove_option('topsecret.server.com','port')
    
    #添加一个标题
    config.add_section('info')
    #在标题下添加options
    config.set('info','name','clint')
    
    #判断是否存在
    print(config.has_section('info'))        #True
    print(config.has_option('info','name'))    #True
    
    #将修改的内容存入文件
    config.write(open('new_example.ini','w'))

    十、paramiko模块

    paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,fabric和ansible内部的远程管理就是使用paramiko

    下载安装:

    # paramiko 模块内部依赖pycrypto,所以先下载安装pycrypto
    pip3 install pycrypto
    pip3 install paramiko

    使用:

    # -*- coding:utf-8 -*-
    # @Author  : Clint
    import paramiko
    
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect('192.168.178.1', 8000, 'clint', '123456')
    stdin, stdout, stderr = ssh.exec_command('df')
    print(stdout.read())
    ssh.close()
    
    # 执行命令 - 用户名+密码

    十一、shelve模块

    shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象,可读可写,key必须为字符串,而值可以是python所支持的数据类型

    import shelve
    
    f=shelve.open(r'sheve.txt')
    # f['stu1']={'name':'clint','age':18,'hobby':['basketball','sporting']}
    # f['stu2']={'name':'eve','age':18,'hobby':'watching movie'}
    
    print(f['stu1']['hobby'])
    f.close()

    十二、logging模块

    用于便捷记录日志且线程安全的模块,python的logging模块提供了标准的日志接口,通过它存储各种格式的日志,logging的日志可以分为 debug、info、warning、error、critical5个级别

    # -*- coding:utf-8 -*-
    # @Author  : Clint
    import logging
    
    logging.basicConfig(filename='log.log',
                        format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                        datefmt='%Y-%m-%d %H:%M:%S %p',
                        level=10)
    
    logging.debug('debug')
    logging.info('info')
    logging.warning('warning')
    logging.error('error')
    logging.critical('critical')
    logging.log(10, 'log')
    logg.py
    2019-05-18 10:01:23 AM - root - DEBUG -logg:  debug
    2019-05-18 10:01:23 AM - root - INFO -logg:  info
    2019-05-18 10:01:23 AM - root - WARNING -logg:  warning
    2019-05-18 10:01:23 AM - root - ERROR -logg:  error
    2019-05-18 10:01:23 AM - root - CRITICAL -logg:  critical
    2019-05-18 10:01:23 AM - root - DEBUG -logg:  log
    运行结果 logg.log
  • 相关阅读:
    bisect in Python
    1385. 两个数组间的距离值
    面试题 04.08. 首个共同祖先
    Python关键字yield
    1237. 找出给定方程的正整数解
    响应式文字
    java环境变量设置
    小 div在大 div中左右上下居中
    清除浮动
    jQuery 图片等比缩放
  • 原文地址:https://www.cnblogs.com/Utopia-Clint/p/10878439.html
Copyright © 2020-2023  润新知