• Python自动化开发


    本节内容

    1、模块介绍

    2、time&datetime模块

    3、random模块

    4、os模块

    5、sys模块

    6、json&pickle模块

    7、logging模块

    一、模块介绍

    模块,是一堆代码实现了某个功能的代码集合。

    类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合

    而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块

    如:os 是系统相关的模块;file是文件操作相关的模块

    模块分为三种:

    • 自定义模块

    • 内置标准模块(又称标准库)

    • 开源模块

    二、time&datetime模块
    import time
    import datetime
    
    print(time.time())     # 通用OS诞生元年至今时间戳
    t = time.localtime()   # 返回本地时间的struct time对象格式
    print(t)               # 可用于定制化输出
    print("%s-%s-%s %s:%s:%s" % (t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec))
    
    print(time.gmtime())  # 返回utc时间的struc时间对象格式
    
    
    # 日期字符串转成时间戳
    string_2_struct = time.strptime("2017/02/20", "%Y/%m/%d")  # 将日期字符串转成struct时间对象格式
    print(string_2_struct)
    
    struct_2_stamp = time.mktime(string_2_struct)                # 将struct时间对象转成时间戳
    print(struct_2_stamp)
    
    # 将时间戳转为字符串格式
    print(time.gmtime(time.time()-86640))     # 将utc时间戳转换成struct_time格式
    print(time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime()))  # 将utc struct_time格式转成指定的字符串格式
    
    # 时间加减
    print(datetime.datetime.now())   # 返回系统当前时刻 2017-02-18 15:59:33.948776
    print(time.time())               # 时间戳
    print(datetime.date.fromtimestamp(time.time()))   # 时间戳直接转成日期格式 2017-02-18
    print(datetime.datetime.now())
    print(datetime.datetime.now() + datetime.timedelta(hours=1, minutes=10))  # 当前时间加1小时,10分钟
    print(datetime.datetime.now().replace(year=2016))  # 时间替换为2016年
    

    时间戳与时间字符串相互转化如下: 

    三、random模块
    import random
    import string
    
    print(random.randint(1, 10))         # 随机1-10,包括10的任意整数
    print(random.randrange(1, 20, 2))    # 随机1-20,步长为2,但不包括20,随机整数
    print(random.sample(range(100), 2))  # 从源列表中任意取2的元素,组成列表
    
    # 生成4位验证码
    source = string.ascii_uppercase + string.digits
    print("".join(random.sample(source, 4)))
    四、os模块

    提供对操作系统进行调用的接口

    os.getcwd()          # 获取当前工作目录,即当前python脚本工作的目录路径
    os.chdir("dirname")  # 改变当前脚本工作目录;相当于shell下cd
    os.curdir  # 返回当前目录: ('.')
    os.pardir  # 获取当前目录的父目录字符串名:('..')
    os.makedirs('dirname1/dirname2')    # 可生成多层递归目录
    os.removedirs('dirname1')           # 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
    os.mkdir('dirname')       # 生成单级目录;相当于shell中mkdir dirname
    os.rmdir('dirname')       # 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
    os.listdir('dirname')     # 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
    os.remove()  # 删除一个文件
    os.rename("oldname","newname")  # 重命名文件/目录
    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所指向的文件或者目录的最后修改时间
    五、sys模块
    sys.argv           # 命令行参数List,第一个元素是程序本身路径
    sys.exit(n)        # 退出程序,正常退出时exit(0)
    sys.version        # 获取Python解释程序的版本信息
    sys.maxsize         # 最大的Int值
    sys.path           # 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
    sys.platform       # 返回操作系统平台名称
    sys.stdout.write('please:')
    val = sys.stdin.readline()[:-1]
    六、json&pickle模块

    用于序列化的两个模块

    json,用于字符串 和 python数据类型间进行转换

    pickle,用于python特有的类型 和 python的数据类型间进行转换

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

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

    import pickle
    
    # 更新数据到文档
    account = {
        "id": 1234,
        "password": "abc",
        "credit": 15000,
        "balance": 8000
    }
    
    f = open("account.db", "wb")
    pickle.dump(account, f)
    f.close()
    
    # 从文件读取数据
    f = open("account.db", "rb")
    account = pickle.load(f)
    f.close()
    print(account)
    七、logging模块

    1、基本log功能

    很多程序都有记录日志的需求,并且日志中包含的信息既有正常的程序访问日志,还可能有错误、警告等信息输出,

    Python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,

    logging的日志可以分为 debug(), info(), warning(), error() and critical() 5个级别,下面我们看一下简单输出信息

    logging.warning("user [Jonathan] attempted wrong password more than 3 times")
    logging.critical("server is down")
    
    # 输出结果
    WARNING:root:user [Jonathan] attempted wrong password more than 3 times
    CRITICAL:root:server is down
    

    了解几个日志级别代表什么意思

    级别 数字 简介
    DEBUG 10 调试信息
    INFO 20 程序正常运行确认信息
    WARNING 30 程序告警,或者即将出现的情况(如,磁盘空间不足),但程序仍然可以运行
    ERROR 40 程序错误,一些功能不能运行
    CRITICAL 40 严重错误,程序不能运行

    如果想把日志写到文件里,也很简单

    import logging
     
    logging.basicConfig(filename='example.log',level=logging.INFO)
    logging.debug('This message should go to the log file')
    logging.info('So should this')
    logging.warning('And this, too')
    
    '''
    level=loggin.INFO意思是,把日志纪录级别设置为INFO,也就是说,只有比日志是INFO或比INFO级别更高的日志才会被纪录到文件里。
    在这个例子, 第一条日志是不会被纪录的,如果希望纪录debug的日志,那把日志级别改成DEBUG就行了
    '''
    

    日志格式加上时间

    import logging
    logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
    logging.warning('is when this event was logged.')
    

    日志格式总结如下

    %(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

    用户输出的消息

     

    2、log打印到屏幕和文件日志


    Python 使用logging模块记录日志涉及四个主要类:

    logger提供了应用程序可以直接使用的接口;

    handler将(logger创建的)日志记录发送到合适的目的输出;

    filter提供了细度设备来决定输出哪条日志记录;

    formatter决定日志记录的最终输出格式。

    它们之间的关系如下图所示

     

    logger

    每个程序在输出信息之前都要获得一个logger。logger通常对应了程序的模块名,比如聊天工具的图形界面模块可以这样获得它的logger:

    LOG = logging.getLogger(”chat.gui”)

    而核心模块可以这样:

    LOG=logging.getLogger(”chat.kernel”)

    logger.setLevel(lel):指定最低的日志级别,低于lel的级别将被忽略。DEBUG是最低的内置级别,CRITICAL为最高

    logger.addFilter(filt)、logger.removeFilter(filt):添加或删除指定的filter

    logger.addHandler(hdlr)、logger.removeHandler(hdlr):增加或删除指定的handler

    logger.debug()、logger.info()、logger.warning()、logger.error()、logger.critical():可以设置的日志级别

     

    handler

    handler对象负责发送相关的信息到指定目的地。

    Python的日志系统有多种Handler可以使用。

    •  有些Handler可以把信息输出到控制台;

    •  有些Logger可以把信息输出到文件;

    •  还有些 Handler可以把信息发送到网络上;

    •  如果觉得不够用,还可以编写自己的Handler

    可以通过addHandler()方法添加多个多handler
    Handler.setLevel(lel):指定被处理的信息级别,低于lel级别的信息将被忽略

    Handler.setFormatter():给这个handler选择一个格式

    Handler.addFilter(filt)、Handler.removeFilter(filt):新增或删除一个filter对象


    每个Logger可以附加多个Handler。接下来我们就来介绍一些常用的Handler:

    1) logging.StreamHandler

    使用这个Handler可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息。它的构造函数是:

    StreamHandler([strm])

    其中strm参数是一个文件对象。默认是sys.stderr


    2) logging.FileHandler

    和StreamHandler类似,用于向一个文件输出日志信息。不过FileHandler会帮你打开这个文件。它的构造函数是:

    FileHandler(filename[,mode])

    filename是文件名,必须指定一个文件名。

    mode是文件的打开方式。参见Python内置函数open()的用法。默认是’a',即添加到文件末尾

     

    3) logging.handlers.RotatingFileHandler

    这个Handler类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,

    然后创建 一个新的同名日志文件继续输出。比如日志文件是chat.log。当chat.log达到指定的大小之后,

    RotatingFileHandler自动把 文件改名为chat.log.1。

    不过,如果chat.log.1已经存在,会先把chat.log.1重命名为chat.log.2。。。最后重新创建 chat.log,继续输出日志信息。它的构造函数是:

    RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])

    其中filename和mode两个参数和FileHandler一样。

    maxBytes用于指定日志文件的最大文件大小。如果maxBytes为0,意味着日志文件可以无限大,这时上面描述的重命名过程就不会发生。

    backupCount用于指定保留的备份文件的个数。比如,如果指定为2,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除


    4) logging.handlers.TimedRotatingFileHandler

    Handler和RotatingFileHandler类似,不过,它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就自动创建新的日志文件

    重命名的过程与RotatingFileHandler类似,不过新的文件不是附加数字,而是当前时间。它的构造函数是:

    TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])

    其中filename参数和backupCount参数和RotatingFileHandler具有相同的意义。

    interval是时间间隔。

    when参数是一个字符串。表示时间间隔的单位,不区分大小写。它有以下取值:

    S 秒

    M 分

    H 小时

    D 天

    W 每星期(interval==0时代表星期一)

    midnight 每天凌晨

  • 相关阅读:
    python技巧31[移植python2.x到3.x]
    python转载[正则表达式指南]
    Linux守护进程(init.d和xinetd)
    系统host文件的使用
    python技巧31[python文件的encoding和str的decode]
    python类库26[读写mysql]
    Windows批处理中文件的属性
    python类库31[读取环境变量]
    python基础31[python内置函数列表]
    文件共享和存储服务器
  • 原文地址:https://www.cnblogs.com/jonathan1314/p/6419116.html
Copyright © 2020-2023  润新知