python常用模块

一、日期和时间

时间戳

# 从1970年到现在经过的秒数
# 作用:用于时间间隔的计算
import time

print(time.time())  # 获得float型 1668571939.8918502

时间格式化符号

格式 含义 输出 备注
%a 本地简化星期名称 wed
%A 本地完整星期名称 Wednesday
%b 本地简化月份名称 Nov
%B 本地完整月份名称 November
%c 本地相应的日期和时间表示 Wed Nov 16 12:36:25 2022
%d 一个月的第几天(01-31) 16
%H 一天中的第几小时(24小时制) 12
%I 第几小时(12小时制) 12
%j 一年中的第几天 (001-366天) 320
%m 月份(01-12) 11
%M 分钟(01-59) 44
%p 本地AM或PM标识 PM 只有与%I配合才有意义
%S 秒 (01-61) 21 闰年秒占两秒,(4年一润,百年不润,400年一润)
%U 一年中第几周(00-53)以星期天为一周开始, 46
%w 一周中的第几天(0-6,0表示星期天)
%x 本地相应日期 11/16/22
%X 本地相应时间 13:03:30
%y 去掉世纪的年份(00-99) 22
%Y 完整的年份 2022
%Z 时区的名字(不存在时为空字符) 中国标准时间
%% %字符
import time

print(time.strftime('%a'))  # Wed
print(time.strftime("%A"))  # Wednesday
print(time.strftime('%b'))  # Nov
print(time.strftime("%B"))  # November
print(time.strftime("%c"))  # Wed Nov 16 12:36:25 2022
print(time.strftime('%d'))  # 16
print(time.strftime("%H"))  # 12
print(time.strftime("%I"))  # 12
print(time.strftime('%j'))  # 320
print(time.strftime("%m"))  # 11
print(time.strftime("%M"))  # 44
print(time.strftime("%p"))  # PM
print(time.strftime("%S"))  # 21
print(time.strftime("%U"))  # 46
print(time.strftime("%w"))  # 3
print(time.strftime("%W"))  # 46
print(time.strftime("%x"))  # 11/16/22
print(time.strftime("%X"))  # 13:03:30
print(time.strftime("%y"))  # 22
print(time.strftime('%Y'))  # 2022
print(time.strftime("%Z"))  # 中国标准时间

struct_time元组(时间结构化)

序号 属性 字段
0 tm_year 4位数年 如2008
1 tm_mon 1-12
2 tm_mday 1-31
3 tm_hour 小时 0-23
4 tm_min 分钟 0-59
5 tm_sec 0-61(60或61是润秒)
6 tm_wday 一周的第几日 0-6(0是周一)
7 tm_yday 一年的第几日 1-366
8 tm_isdst 夏令时 -1,0,1,-1是决定是否为夏令时的旗帜
import time
res = time.localtime() # 本地时区的struct_time
# res = time.gmtime() # UTC时区的struct_time
print(res) 
# time.struct_time(
# tm_year=2022, 
# tm_mon=11, 
# tm_mday=16, 
# tm_hour=13, 
# tm_min=17, 
# tm_sec=9, 
# tm_wday=2, 
# tm_yday=320, 
# tm_isdst=0)

时间格式相互转换
三种时间状的相互转换

  • mktime(struct_time):struct_time->timestamp、localtime(t)/mgtime(t):timestamp->struct_time
  • strftime(struct_time):struct_time->format_str、strptime(strftime):format_str->struct_time
  • time.ctime(t) ---> "%a %b %d %H:%M:%S %Y"
  • time.asctime(struct_time) --> "%a %b %d %H:%M:%S %Y"
# 时间戳转为结构化时间
# 时间戳转为结构化时间
import time

res = time.time()

struct_time =time.localtime(res)

# 结构化时间转为字符串时间
strftime_time = time.strftime('%Y-%m-%d %X',struct_time)

# 字符串时间转为结构化时间
strftime_time2 = time.strftime("%Y-%m-%d %X")
strftime_time2 = time.strftime("%Y-%m-%d %X")
struct_time2= time.strptime(strftime_time2,"%Y-%m-%d %X")


# 结构化时间转为时间戳
struct_time3 = time.localtime()
time3 = time.mktime(struct_time3)
print(time3)

# 其他asctime、ctime
print(time.asctime(time.localtime()))
print(time.ctime(time.time()))


二、time模块

函数名 作用 备注
time() 获取时间戳
localtime([secs]) 通过时间戳获取格式化时间
gmtime([secs]) 通过时间戳获取格式化时间(UTC时间)
mktime(struct_time) 通过结构化时间获取时间戳
asctime([struct_time]) 通过结构化时间获取"%a %b %d %H:%M:%S %Y"格式字符串
ctime([secs]) 通过时间戳获取"%a %b %d %H:%M:%S %Y"格式字符串
sleep(secs) 推迟运行
clock()(3.8废除) 返回当前CPU运行到当前的时间 perf_counter代替
strftime(format,[struct_time]) 将结构化元组时间转为格式化字符串时间
strptime(formatstr,format) 将格式化字符串时间转为结构化元组时间 format需与formatstr相对应

三、datatime模块

# 常用模块 datatime.datatime.now()、datetime.timedelta()、datetime.datetime.fromtimestamp(t)
# 三周以后
import datetime
print(datetime.datetime.now()+datetime.timedelta(weeks=3))
# 10天前
print(datetime.datetime.now()+datetime.timedelta(days=-10))

四、random模块

import random
print(random.random()) # 生成0-1之间的随机小数
print(random.randint(1,3)) # [1,3] 生成大于等于1小于等于3的整数
print(random.randrange(1,3)) # [1,3) 大于等于1小于3的整数
print(random.choice([1,2,3,4,5,6])) # 选取其中一个
print(random.choices([1,2,3,4,5,6],weights=[1,2,3,4,5,6],k=5)) # k选取次数,weights:相对权重,返回一个列表
print(random.sample([1,2,3,4,5],4)) # 返回任意4(可变)个元素组合
print(random.uniform(1,3)) # (1,3) 大于1小于3的任意小数
res = [1,2,3,4,5]
random.shuffle(res) # 改变原序列,洗牌,打乱顺序
print(res)

os模块

属性函数 作用
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: ('.')
os.pardir 获取当前目录的父目录字符串名:('..')
os.makedirs('name1/name2') 可生成多层递归目录
os.removedirs('name1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir(dirname) 生成单级目录;相当于shell中mkdir dirname
os.rmdir(dirname) 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir(dirname) 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove(filename) 删除一个文件
os.rename(oldname,newname) 重命名文件/目录
os.stat('path/filename') 获取文件/目录信息
os.sep 输出操作系统特定的路径分隔符,win下为"\",Linux下为"/"
os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system('shell 命令') 运行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.isdir(path) 如果path是一个存在的文件,返回True。否则返回False
os.path.isfile(path) 如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1,[path2]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
os.path.getctime(path)
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path) 返回path的大小
os.path.normcase(path) 在Linux和Mac平台上,该函数会原样返回path,在windows平台上会将路径中所有字符转换为小写,并将所有斜杠转换为饭斜杠。
os.path.normpath(path) 规范化路径,如..和/
# 在python3.5之后,推出了一个新的模块pathlib
from pathlib import Path
res = Path(__file__).parent.parent
print(res)

sys模块

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

shutill

shutil.copyfileobj(fsrc,fdst,[len])

# 将文件内容拷贝到另一个文件中
import shutil
# copyfileobj(fsrc,fdst,[length])将文件内容拷贝到另一个文件中
# shutil.copyfileobj(open(r'./其他.md','r',encoding='utf-8'),open(r'./copy.md','w',encoding='utf-8'),1)
# copyfile(src,dst)拷贝文件,目标文件无需存在
# shutil.copyfile('text.py',"copy.md")
# copymode仅拷贝权限。内容、组、用户均不变。目标文件必须存在
# shutil.copymode('text.py',"copy.md")

# copystat仅拷贝状态的信息,包括:mode bits, atime, mtime, flags。目标文件必须存在
# import os
# print(os.stat("copy.md"))
# shutil.copystat('text.py',"copy.md")
# print(os.stat("copy.md"))

# copy(src,dst) 拷贝文件和权限
# shutil.copy('text.py',"copy.md")

# 拷贝文件和状态信息
# shutil.copy2('text.py',"copy.md")

#递归的去拷贝文件夹:shutil.ignore_patterns(*patterns),shutil.copytree(src, dst, symlinks=False, ignore=None)
# shutil.copytree(r'aaa',r'bbb',ignore=shutil.ignore_patterns("a.txt")) #目标目录不能存在,注意对folder2目录父级目录要有可写权限,ignore的意思是排除

# 递归的去删除文件
# shutil.rmtree(r'bbb')

# 递归的去移动文件,它类似mv命令,其实就是重命名。
# shutil.move(r'b.txt','./c.txt')

# 创建压缩包并返回文件路径,例如:zip、tar
# shutil.make_archive(base_name, format,...)
# base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,
#               如 data_bak  =>保存至当前路径
#               如:/tmp/data_bak =>保存至/tmp/
# format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
# root_dir: 要压缩的文件夹路径(默认当前目录)
# owner: 用户,默认当前用户
# group: 组,默认当前组
# logger: 用于记录日志,通常是logging.Logger对象
# shutil.make_archive(r'./bbb/aaa','gztar',root_dir=r'aaa')

# 解压
# import tarfile
# t = tarfile.open(r'./bbb/aaa.tar.gz','r')
# t.extractall('./ccc')
# t.close()

shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,详细

# import zipfile
#
# # 压缩
# z = zipfile.ZipFile('laxi.zip', 'w')
# z.write('a.log')
# z.write('data.data')
# z.close()
#
# # 解压
# z = zipfile.ZipFile('laxi.zip', 'r')
# z.extractall(path='.')
# z.close()

# import tarfile

# 压缩
# t=tarfile.open('/tmp/egon.tar','w')
# t.add('/test1/a.py',arcname='a.bak')
# t.add('/test1/b.py',arcname='b.bak')
# t.close()

# 解压
# t=tarfile.open('/tmp/egon.tar','r')
# t.extractall('/egon')
# t.close()

json vs pickle模块

xml模块

shelve模块

configparser模块

hashlib模块

suprocess模块

logging模块

日志级别及配置

import logging

# 一:日志配置
logging.basicConfig(
    # 1、日志输出位置:1、终端 2、文件
    # filename='access.log', # 不指定,默认打印到终端

    # 2、日志格式
    format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',

    # 3、时间格式
    datefmt='%Y-%m-%d %H:%M:%S %p',

    # 4、日志级别
    # critical => 50
    # error => 40
    # warning => 30
    # info => 20
    # debug => 10
    level=30,
)

# 二:输出日志
logging.debug('调试debug')
logging.info('消息info')
logging.warning('警告warn')
logging.error('错误error')
logging.critical('严重critical')

'''
# 注意下面的root是默认的日志名字
WARNING:root:警告warn
ERROR:root:错误error
CRITICAL:root:严重critical
'''

日志配置字典

"""
logging配置
"""

import os

# 1、定义三种日志输出格式,日志中可能用到的格式化串如下
# %(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、强调:其中的%(name)s为getlogger时指定的名字
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
                  '[%(levelname)s][%(message)s]'

simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'

test_format = '%(asctime)s] %(message)s'

# 3、日志配置字典
LOGGING_DIC = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'standard': {
            'format': standard_format
        },
        'simple': {
            'format': simple_format
        },
        'test': {
            'format': test_format
        },
    },
    'filters': {},
    'handlers': {
        #打印到终端的日志
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',  # 打印到屏幕
            'formatter': 'simple'
        },
        #打印到文件的日志,收集info及以上的日志
        'default': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,日志轮转
            'formatter': 'standard',
            # 可以定制日志文件路径
            # BASE_DIR = os.path.dirname(os.path.abspath(__file__))  # log文件的目录
            # LOG_PATH = os.path.join(BASE_DIR,'a1.log')
            'filename': 'a1.log',  # 日志文件
            'maxBytes': 1024*1024*5,  # 日志大小 5M
            'backupCount': 5,
            'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
        },
        'other': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',  # 保存到文件
            'formatter': 'test',
            'filename': 'a2.log',
            'encoding': 'utf-8',
        },
    },
    'loggers': {
        #logging.getLogger(__name__)拿到的logger配置
        '': { 
            'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
            'level': 'DEBUG', # loggers(第一层日志级别关限制)--->handlers(第二层日志级别关卡限制)
            'propagate': False,  # 默认为True,向上(更高level的logger)传递,通常设置为False即可,否则会一份日志向上层层传递
        },
        '专门的采集': {
            'handlers': ['other',],
            'level': 'DEBUG',
            'propagate': False,
        },
    },
}

使用

import settings
# !!!强调!!!
# 1、logging是一个包,需要使用其下的config、getLogger,可以如下导入
# from logging import config
# from logging import getLogger

# 2、也可以使用如下导入
import logging.config # 这样连同logging.getLogger都一起导入了,然后使用前缀logging.config.

# 3、加载配置
logging.config.dictConfig(settings.LOGGING_DIC)

# 4、输出日志
logger1=logging.getLogger('用户交易')
logger1.info('egon儿子alex转账3亿冥币')

# logger2=logging.getLogger('专门的采集') # 名字传入的必须是'专门的采集',与LOGGING_DIC中的配置唯一对应
# logger2.debug('专门采集的日志')

re模块

posted @ 2022-11-19 00:16  转角90  阅读(21)  评论(0编辑  收藏  举报