• python 模块


    1.导入模块方法

    import module
    from module.xx.xx import xx
    from module.xx.xx import xx as rename 
    from module.xx.xx import *
     
    test.py下面代码
    if __name__ == '__main__':
      pass
     
    a   被调用:text.py被调用时,main里面语句不执行,
    b.  自己调用:自身执行时main里面语句执行,用于逻辑测试

    1、time

    时间相关的操作,时间有三种表示方式:

    • 时间戳               1970年1月1日之后的秒,即:time.time()
    • 格式化的字符串    2014-11-11 11:11,    即:time.strftime('%Y-%m-%d') 
    • 结构化时间          元组包含了:年、日、星期等... time.struct_time    即:time.localtime()
    # 时间模块
    import time
    
    # 时间戳
    print(time.time())  # 1537550201.7291784
    
    # 时间结构
    print(time.localtime())  # time.struct_time(tm_year=2018, tm_mon=9, tm_mday=22, tm_hour=1, tm_min=19, tm_sec=50, tm_wday=5, tm_yday=265, tm_isdst=0)
    
    print(time.localtime().tm_year)  # 2018
    
    # 结构化时间转换为字符串时间
    print(time.strftime("%Y-%m-%d %X", time.localtime()))  # 2018-09-22 01:34:01
    print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))  # 2018-09-22 01:34:01
    
    # 字符串时间转换为结构化时间
    print(time.strptime("2018-09-22 01:34:01",
                        "%Y-%m-%d %H:%M:%S"))  # time.struct_time(tm_year=2018, tm_mon=9, tm_mday=22, tm_hour=1, tm_min=34, tm_sec=1, tm_wday=5, tm_yday=265, tm_isdst=-1)
    
    #
    print(time.asctime())  # Sat Sep 22 01:40:29 2018
    print(time.ctime())  # Sat Sep 22 01:40:29 2018
    
    # datetime模块
    import datetime
    
    print(datetime.datetime.now())  # 2018-09-22 01:44:16.817567

    2、random

    # random模块
    import random
    
    print(random.random() * 1000)  # 893.8943826322712
    print(random.randint(0, 9))  # 1到100
    print(random.randrange(1, 100))  # 1到99
    print(random.choice([32, 23, 5, 3]))  # 随机选一个
    print(random.sample([32, 23, 5, 3, 2], 3))  # 随机选3个
    
    
    # 四位数随机验证码 A-Z 65-90 a-z 97-122 0-9
    def ident_code(num=4):
        res = ""
        for i in range(num):
            num1 = str(random.randint(0, 9))
            a = chr(random.randint(65, 90))
            b = chr(random.randint(97, 122))
            res += random.choice([num1, a, b])
        return res
    
    
    print(ident_code())

    3、sys BASE_DIR

    用于提供对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       错误相关
    # BASER_DIR 添加环境变量
    import sys, os
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.append(BASE_DIR)

    # from package import module
    print(__file__) # C:/Disk_D/pycharm_stu/svn/python/macboy/study/模块.py
    print(os.path.dirname(__file__)) # C:/Disk_D/pycharm_stu/svn/python/macboy/study
    print(BASE_DIR) # C:/Disk_D/pycharm_stu/svn/python/macboy
    
    
    # 进度条
    for i in range(11):
    time.sleep(0.1)
    sys.stdout.write('#')
    sys.stdout.flush()

    4、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所指向的文件或者目录的最后修改时间

    5、序列化

    Python中用于序列化的两个模块

    • json     用于【字符串】和 【python基本数据类型】 间进行转换 序列化字符串
    • pickle   用于【python特有的类型】 和 【python基本数据类型】间进行转换 序列化字节 也可以序列化对象

    Json模块提供了四个功能:dumps、dump、loads、load

    pickle模块提供了四个功能:dumps、dump、loads、load

    
    
    # json json字符串必须是双引号
    # dumps 字典序列化为json格式
    # loads json格式反序列化为dict
    import json
    
    dic = {'name': 'zq', 'age': 101}
    print(json.dumps(dic))  # {"age": 101, "name": "zq"}
    with open('json_text.txt', "w", encoding='utf-8') as f:
        f.write(json.dumps(dic) + "
    ")
    l = []
    with open('json_text.txt', encoding='utf-8') as f:
        for i in f:
            l.append(json.loads(i.strip()))
    
    for i in range(len(l)):
        print("名字是:%s,年龄是:%s" % (l[i]['name'], l[i]['age'])) # 名字是:zq,年龄是:101
    # pickle 序列化bit流
    import pickle
    d = {'name':'zxq','age':12}
    d_dumps = pickle.dumps(d) #生成bit流
    print(d_dumps)
    
    d_loads = pickle.loads(d_dumps) #反序列化字典
    print(d_loads)
    
    

    6、xml

    7、re

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

    字符:

      .    匹配除换行符以外的任意字符
      w 匹配字母或数字或下划线或汉字
      s  匹配任意的空白符
      d  匹配数字
        匹配单词的开始或结束
      ^ 匹配字符串的开始
      $ 匹配字符串的结束

    次数:

      * 重复零次或更多次
      + 重复一次或更多次
      ? 重复零次或一次
      {n} 重复n次
      {n,} 重复n次或更多次
      {n,m} 重复n到m次

    #match(pattern, string, flags=0)
    # pattern: 正则模型
    # string : 要匹配的字符串
    # falgs : 匹配模式


    # search,浏览整个字符串去匹配第一个,未匹配成功返回None
    # search(pattern, string, flags=0)


    # findall,获取非重复的匹配列表;如果有一个组则以列表形式返回,且每一个匹配均是字符串;如果模型中有多个组,则以列表形式返回,且每一个匹配均是元祖;
    # 空的匹配也会包含在结果中
    # findall(pattern, string, flags=0)


    # sub,替换匹配成功的指定位置字符串


    #sub(pattern, repl, string, count=0, flags=0)
    # pattern: 正则模型
    # repl : 要替换的字符串或可执行对象
    # string : 要匹配的字符串
    # count : 指定匹配个数
    # flags : 匹配模式



    # split,根据正则匹配分割字符串


    #split(pattern, string, maxsplit=0, flags=0)
    # pattern: 正则模型
    # string : 要匹配的字符串
    # maxsplit:指定分割个数
    # flags : 匹配模式

     推荐格式:

    pattern = "正则匹配项"
    re.compile(pattern).findall("内容")
    
    
    '''
    参考
    https://www.cnblogs.com/tina-python/p/5508402.html
    常用匹配
    ip地址 ipaddr = r'(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'
    手机号 phone_num = r'1d{10}'
    邮箱 email = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,4}"
    链接地址 url = r"http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*,]|(?:%[0-9a-fA-F][0-9a-fA-F]))+"

    '''

    匹配ip地址
    content = ['dfdui256.3.1.1d=1232 df', 'abdffuid=22222 dfsf', '256.5.1.24dffd', 'fdsuid=rrfa', '1.2.1.2', '2.2.2.2','电放费256.1.1.1d']
    ipaddr1 = r'(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' #['1.2.1.2', '2.2.2.2']
    ipaddr2 = r'w(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' #['256.3.1.1', '256.5.1.24', '256.1.1.1']
    ipaddr3 = r'w*(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' #['dfdui256.3.1.1', '256.5.1.24', '1.2.1.2', '2.2.2.2', '电放费256.1.1.1']

    pattern = r"wuid=(d+)"
    pattern1 = r"(d+)" # ['3', '1', '1232', '22222', '256', '5', '1', '1', '2', '1', '2', '2', '2', '2', '2', '1', '1']
    res_ip = re.compile(ipaddr1)
    list_ip = []
    for i in content:
    res = res_ip.findall(i)
    if len(res) > 0:
    list_ip += res
    print(list_ip)
    
    

    8、configparser

    configparser用于处理特定格式的文件,其本质上是利用open来操作文件。

    # configparser模块
    
    #  创建文件
    '''
    [DEFAULT]
    forwardx11 = yes
    
    [default]
    serveraliveinterval = 45
    compressionlevel = 9
    compression = yes
    
    [bitbucket.org]
    user = hg
    
    [topsecret.server.com]
    host port = 50022
    forwardx11 = no
    
    [MYSQL]
    ip addr = 10.1.1.1
    host port = 3306
    user name = zxq
    pssword = zxq
    '''
    import configparser as confpar
    
    data = {'ServerAliveInterval': '45',
            'Compression': 'yes',
            'CompressionLevel': '9', }
    config = confpar.ConfigParser()  # 生成对象
    config["default"] = data  # 将字典写入
    
    config['bitbucket.org'] = {}  # 用生成类似文件内容头
    config['bitbucket.org']['User'] = 'hg'  # 内容头添加字段
    
    config['topsecret.server.com'] = {}
    topsecret = config['topsecret.server.com']
    topsecret['Host Port'] = '50022'  #
    topsecret['ForwardX11'] = 'no'  #
    
    config['DEFAULT']['ForwardX11'] = 'yes'
    
    config['MYSQL'] = {}
    mysqlconf = config['MYSQL']
    mysqlconf['Ip Addr'] = '10.1.1.1'
    mysqlconf['Host Port'] = '3306'
    mysqlconf['User Name'] = 'zxq'
    mysqlconf['Password'] = 'zxq'
    
    with open('config.ini', 'w', encoding='utf-8') as f:
        config.write(f)
     
    # configparse 文件操作 增删改查
    import configparser as confpar
    
    config = confpar.ConfigParser()
    config.read('config.ini')
    
    # 查询
    print(config.sections())  # ['default', 'bitbucket.org', 'topsecret.server.com', 'MYSQL']
    print(config.options('MYSQL'))  # ['ip addr', 'host port', 'user name', 'pssword', 'forwardx11']
    print(config.items(
        "MYSQL"))  # [('forwardx11', 'yes'), ('ip addr', '10.1.1.1'), ('host port', '3306'), ('user name', 'zxq'), ('pssword', 'zxq')]
    print(config['MYSQL']['ip addr'])  # 10.1.1.1
    print(config.get("MYSQL", "ip addr"))  # 10.1.1.1
    
    # 添加
    # config.add_section('TEST')  # 添加标签头
    # config.set('TEST', 'age', '10')  # 添加内容
    #  显示
    # [TEST]
    # age = 10
    
    
    # 删除
    # config.remove_option('TEST', 'name')
    # config.remove_section("TEST")
    
    # 修改
    # config.set('TEST', 'name', 'zhangsan')
    # print(config.get("TEST", "name"))
    
    # 保存
    # config.write(open('config.ini', 'w'))

    9、logging

    用于便捷记录日志且线程安全的模块

    日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET

    默认情况下logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING,默认的日志格式为日志级别:Logger名称:用户输出消息。

    logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有
    filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。
    filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
    format:指定handler使用的日志显示格式。
    datefmt:指定日期时间格式。
    level:设置rootlogger(后边会讲解具体概念)的日志级别
    stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open('test.log','w')),默认为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用户输出的消息

    # 模块logging
    import logging as log
    import time
    
    
    file_name = "access_"+str(time.strftime("%Y%m%d", time.localtime()))+".log"
    log.basicConfig(
        level=log.ERROR,   # 日志级别
        filename=file_name,  # 保存的文件名
        filemode='a',        # 文件打开没事
        format="%(asctime)s %(levelno)s %(message)s"
    )
    log.debug('debug message')
    log.info('info message')
    log.warning('warning message')
    log.error('error message')
    log.critical('critical message')

    # 显示
    # 2019-02-27 17:58:24,829 40 error message
    # 2019-02-27 17:58:24,829 50 critical message
    # 2019-02-27 17:58:26,463 40 error message
    # 2019-02-27 17:58:26,469 50 critical message
    # 2019-02-27 17:58:27,877 40 error message
    # 2019-02-27 17:58:27,877 50 critical message

    logger对象:

    上述几个例子中我们了解到了logging.debug()、logging.info()、logging.warning()、logging.error()、logging.critical()(分别用以记录不同级别的日志信息),logging.basicConfig()(用默认日志格式(Formatter)为日志系统建立一个默认的流处理器(StreamHandler),设置基础配置(如日志级别等)并加到root logger(根Logger)中)这几个logging模块级别的函数,另外还有一个模块级别的函数是logging.getLogger([name])(返回一个logger对象,如果没有指定名字将返回root logger)

    import logging as log
    import time
    
    
    file_name = "access_"+str(time.strftime("%Y%m%d", time.localtime()))+".log"
    
    def logger(root='root'):
        logger = log.getLogger(root)  # 创建log对象
        logger.setLevel("ERROR")  # 定义日志级别
        fm = log.Formatter("%(asctime)s | %(name)s | %(levelname)s | %(module)s:%(message)s",
                           datefmt='%Y-%m-%d %H:%M:%S %p', )  # 日志格式
    
        fileh = log.FileHandler(file_name)  # 创建一个handler,用于写入日志文件
        fileh.setFormatter(fm)
        logger.addHandler(fileh)
    
        streamh = log.StreamHandler()  # 再创建一个handler,用于输出到控制台
        streamh.setFormatter(fm)
        logger.addHandler(streamh)
    
        return logger
    
    l = logger()
    l.debug('debug message')
    l.info('info message')
    l.warning('warning message')
    l.error('error message')
    l.critical('critical message')
    
    # 显示
    # 2019-02-27 18:21:24 PM | root | ERROR | test:error message
    # 2019-02-27 18:21:24 PM | root | CRITICAL | test:critical message
    # 2019-02-27 18:21:26 PM | root | ERROR | test:error message
    # 2019-02-27 18:21:26 PM | root | CRITICAL | test:critical message
    # 2019-02-27 18:21:27 PM | root | ERROR | test:error message
    # 2019-02-27 18:21:27 PM | root | CRITICAL | test:critical message
    
    

    10.hashlib

    用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 解密网站:https://cmd5.com/

    #  hashlib
    import hashlib
    
    # 简单用法
    # ######## md5 ########
    hash = hashlib.md5()
    # help(hash.update)
    hash.update(bytes('admin', encoding='utf-8'))
    print(hash.hexdigest())
    print(hash.digest())
    
    
    
    # 加盐
    import hashlib
    
    # ######## md5 ########
    
    hash = hashlib.md5(bytes('df23df12sf', encoding="utf-8"))
    hash.update(bytes('admin', encoding="utf-8"))
    print(hash.hexdigest())
    
    
    # hmac
    import hmac
    
    h = hmac.new(bytes('898oaFs09f', encoding="utf-8"))
    h.update(bytes('admin', encoding="utf-8"))
    print(h.hexdigest())

    11.subprocess

    call 

    执行命令,返回状态码

    check_call

    执行命令,如果执行状态码是 0 ,则返回0,否则抛异常

    check_output

    执行命令,如果状态码是 0 ,则返回执行结果,否则抛异常

    import subprocess
    
    ret = subprocess.call(["ls", "-l"], shell=False)
    ret = subprocess.call("ls -l", shell=True)
    
    subprocess.check_call(["ls", "-l"])
    subprocess.check_call("exit 1", shell=True)
    
    subprocess.check_output(["echo", "Hello World!"])
    subprocess.check_output("exit 1", shell=True)

    subprocess.Popen(...)

    用于执行复杂的系统命令

    subprocess.PIPE

    在创建Popen对象时,subprocess.PIPE可以初始化stdin, stdout或stderr参数。表示与子进程通信的标准流。

    
    
    import subprocess
    cmd = input(">>: ").strip()

    cmd = '''netstat -ant | awk '/tcp/{print $5}' | cut -d ":" -f1 |grep -v "^$" | grep -v "0.0.0.0" |uniq'''
    res = subprocess.Popen(cmd, shell=True,
    stderr=subprocess.PIPE,
    stdout=subprocess.PIPE,
    stdin=subprocess.PIPE)

    res_error = res.stderr.read() # 读取错误信息标准流
    res_out = res.stdout.read() # 读取正确信息标准流

    print(res_error.decode("gbk"))
    print(res_out.decode("gbk"))
     

    参数:

      • args:shell命令,可以是字符串或者序列类型(如:list,元组)
      • bufsize:指定缓冲。0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲
      • stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
      • preexec_fn:只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用
      • close_sfs:在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道。
        所以不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。
      • shell:同上
      • cwd:用于设置子进程的当前目录
      • env:用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。
      • universal_newlines:不同系统的换行符不同,True -> 同意使用
      • startupinfo与createionflags只在windows下有效
        将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等

     12.struct

    import struct
    length_data = len("alldata") #7个字节
    print(length_data) # 7
    length = struct.pack('i',length_data) #生成bit流
    print(length) # b'x07x00x00x00'

    length_data=struct.unpack('i',length) #是一个tuple
    print(length_data[0]) # 7

    参考:

    http://www.cnblogs.com/wupeiqi/articles/5501365.html

    http://www.cnblogs.com/yuanchenqi/articles/5732581.html

  • 相关阅读:
    Qt技巧、常用第三方库包含(qmake的.pro文件、CMakeLists.txt文件)
    STL资源
    debian 9 安装node angular
    debian 9 安装jenkins
    Consul 入门操作
    Docker 部署 postgresql 与 pgadmin4
    Docker File 与 Docker Compose
    Centos jdk
    Angular7 路由
    Centos Supervisor
  • 原文地址:https://www.cnblogs.com/icemonkey/p/10441112.html
Copyright © 2020-2023  润新知