一、日期和时间
时间戳
# 从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)
时间格式相互转换
![三种时间状的相互转换](1036857-20170215142700722-743334012.png)
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模块