1. 时间模块time、datetime

在python中,表示时间有三种方式:
时间戳

格式化的时间字符串(Format String): '2022-03-01'

时间元组(struct_time)

1.1 time模块

1.1.1 时间戳(time)

(1)生成时间戳

时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。

  1. import time # 导入time模块
  2.  
  3. a = time.time() # 生成时间戳,时间戳是浮点数类型
  4. print(a, type(a)) # 1722591376.9927173 <class 'float'>

(2)时间戳转换为时间元组(UTC时间)     国际时间

将时间戳转换为UTC时间,与英国伦敦当地时间一致

  1. import time
  2.  
  3. b = time.time() # 生成时间戳
  4. c = time.gmtime(b) # 时间戳转换为时间元组类型
  5. print(c, type(c))
  6. # time.struct_time(tm_year=2024, tm_mon=8, tm_mday=2, tm_hour=9, tm_min=43, tm_sec=59, tm_wday=4, tm_yday=215, tm_isdst=0) <class 'time.struct_time'>

(3)时间戳转换为时间元组(当地时间)

UTC时间+8小时=北京时间

  1. import time
  2.  
  3. a = time.time()
  4. b = time.localtime(a)
  5. print(b)
  6. # time.struct_time(tm_year=2024, tm_mon=8, tm_mday=2, tm_hour=17, tm_min=51, tm_sec=9, tm_wday=4, tm_yday=215, tm_isdst=0)

1.1.2 字符串格式化时间(strftime)

  1. 符号 含义
  2. %y 两位数的年份表示 00-99
  3. %Y 四位数的年份表示 000-9999
  4. %m 月份 01-12
  5. %d 月内中的一天   0-31
  6. %H 24小时制小时数 0-23
  7. %I 12小时制小时数 01-12
  8. %M 分钟数 00=59
  9. %S 00-59
  10. %a 本地简化星期名称
  11. %A 本地完整星期名称
  12. %b 本地简化的月份名称
  13. %B 本地完整的月份名称
  14. %c 本地相应的日期表示和时间表示
  15. %j 年内的一天 001-366
  16. %p 本地A.M.或P.M.的等价符
  17. %U 一年中的星期数 00-53)星期天为星期的开始
  18. %w 星期 0-6),星期天为星期的开始
  19. %W 一年中的星期数 00-53)星期一为星期的开始
  20. %x 本地相应的日期表示
  21. %X 本地相应的时间表示
  22. %Z 当前时区的名称
  23. %% %号本身
  1. import time
  2.  
  3. # 时间元组放或不放都行
  4. a = time.strftime('%Y-%m-%d %H:%M:%S')
  5. print(a) # 2024-08-02 18:09:09
  6. b = time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime())
  7. print(b) # 2024-08-02 10:09:09
  8. c = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
  9. print(c) # 2024-08-02 18:09:09
  10.  
  11. d = time.strftime('%c')
  12. print(d) # Fri Aug 2 18:09:09 2024

1.1.3 时间元组(struct_time)

(1)time.localtime   时间戳--->时间元组

  1. import time
  2.  
  3. print(time.localtime())
  4. # time.struct_time(tm_year=2024, tm_mon=8, tm_mday=2, tm_hour=18, tm_min=28, tm_sec=19, tm_wday=4, tm_yday=215, tm_isdst=0)

(2)time.mktime     时间元组--->时间戳

  1. print(time.mktime(time.localtime())) # 1722594776.0

(3)time.strftime     时间元组--->时间字符串

时间元组参数若不写,则使用当前时间

  1. import time
  2.  
  3. print(time.strftime("%Y-%m-%d ", time.localtime()))
  4. # 2024-08-02
  5. print(time.strftime("%H:%M:%S ", time.localtime()))
  6. # 18:50:35

(4)time.strptime 时间字符串--->时间元组

  1. import time
  2.  
  3. print(time.strptime('2022-02-28 09:22:05', '%Y-%m-%d %H:%M:%S'))
  4. # time.struct_time(tm_year=2022, tm_mon=2, tm_mday=28, tm_hour=9, tm_min=22, tm_sec=5, tm_wday=0, tm_yday=59, tm_isdst=-1)

(5)time.asctime    时间元组--->标准的时间格式

  1. import time
  2.  
  3. print(time.asctime(time.localtime())) # Fri Aug 2 19:05:20 2024
  4. print(time.asctime()) # Fri Aug 2 19:05:20 2024

(6)time.ctime         时间戳--->标准的时间格式

  1. import time
  2.  
  3. print(time.ctime(time.time())) # Fri Aug 2 19:08:23 2024
  4. print(time.ctime()) # Fri Aug 2 19:08:23 2024

1.1.4 小结

时间戳是计算机处理时间的方法

时间字符串是人类能够看懂的字符串

时间元组是两者的中间值,用来互相转换

1.2 datetime模块

(1)自定义日期并格式化输出

  1. import datetime
  2.  
  3. a = datetime.date(2023, 11, 20)
  4. print(a) # 2023-11-20

(2)获取当地时间

年月日

  1. import datetime
  2.  
  3. print(datetime.date.today()) # 2024-08-02

年月日时分秒

  1. import datetime
  2.  
  3. a = datetime.datetime.today()
  4. print(a) # 2024-08-02 19:43:42.946123
  5.  
  6. # 以以上时间a为基础,可以得到更加具体的数据
  7. print(a.year) # 2024
  8. print(a.month) # 8
  9. print(a.day) # 2
  10. print(a.hour) # 19
  11. print(a.minute) # 46
  12. print(a.second) # 30
  13. print(a.weekday) # 星期(weekday星期是0-6) 0表示周一
  14. print(a.isoweekday) # 获取星期(weekday星期是1-7) 1表示周一

(3)timedelta  时间日期的增减对象

打印时间增减

  1. import datetime
  2.  
  3. # 生成一个时间数据,可以对日期进行加减
  4. ahead_day = datetime.timedelta(days=2)
  5. print(ahead_day) # 2 days, 0:00:00
  6.  
  7. delay_day = datetime.timedelta(days=3)
  8. print(delay_day) # 3 days, 0:00:00

对日期进行增减

  1. import datetime
  2.  
  3. # 打印当前时间提前2天的具体时间
  4. ahead_day = datetime.timedelta(days=2)
  5. print(datetime.datetime.today() - ahead_day) # 2024-07-31 19:57:35.348771
  6.  
  7. # 打印当前时间往后3天的具体时间
  8. delay_day = datetime.timedelta(days=3)
  9. print(datetime.datetime.today() + delay_day) # 2024-08-05 19:59:09.937551

日期对象与timedelta之间的关系:

  日期对象 = 日期对象 + / - timedelta对象
     timedelta对象 = 日期对象 + / - 日期对象

2. 随机模块random

  1. import random
  2.  
  3. # 1.随机生成0~1之间的小数 random
  4. a = random.random()
  5. print(a) # 0.46371291740686915
  6.  
  7. # 2.生成指定区间的小数 uniform
  8. b = random.uniform(1, 2)
  9. print(b) # 1.90434431469814
  10.  
  11. # 3.随机区间整数,两侧都可以取到 randint
  12. c = random.randint(11, 13)
  13. print(c) # 13
  14.  
  15. # 4.随机区间整数,要考虑起始值和步长 randrange
  16. d = random.randrange(1, 10, 2)
  17. print(d) # 1,3,5,7,9中取一个数
  18.  
  19. # 5.随机返回列表的一个元素 choice
  20. e = ['messi', 'ronaldo', 'neymar', 'kylian']
  21. print(random.choice(e)) # messi
  22.  
  23. # 6.随机返回列表指定个数元素 sample
  24. f = ['messi', 'ronaldo', 'neymar', 'kylian', 'haaland']
  25. print(random.sample(f, 2))
  26. # ['neymar', 'haaland']
  27.  
  28. # 7.打乱列表顺序,作用在原列表上 shuffle
  29. g = [1, 2, 3, 4, 5, 6, 7, 8, 9]
  30. random.shuffle(g)
  31. print(g) # [1, 6, 8, 4, 5, 7, 3, 2, 9]

random模块的应用场景

  1. # chr方法:根据ASCII码表的顺序,传入数字以展示对应的字符
  2. import random
  3.  
  4. print(chr(65)) # A
  5. print(chr(90)) # Z
  6. print(chr(97)) # a
  7. print(chr(122)) # z
  8.  
  9. # 生成一个6位数的随机验证码
  10. def identify_code(n):
  11. code = '' # 初始为空,循环一次字符串个数加一个
  12. for i in range(n): # 定义循环的次数
  13. upper_case = chr(random.randint(65, 90))
  14. lower_case = chr(random.randint(97, 122))
  15. num = str(random.randint(0, 9))
  16. code += random.choice([upper_case, lower_case, num]) # 每次循环在大小写、数字中随机取一个
  17. return code
  18.  
  19. print(identify_code(6)) # j9025B

3. 摘要算法hashlib模块

3.1 概念

摘要算法又称为哈希算法、散列算法

通过一个函数将任意长度的数据转换成一个固定长度的字符串,16进制32位长度

摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被修改过。摘要算法之所以能指出数据是否被修改过,就是因为摘要函数是一个单向函数。
计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

python的hashlib提供了常见的摘要算法:MD5、SHA1

3.2  md5算法

  1. import hashlib
  2.  
  3. def encrypt(a):
  4. tool = hashlib.md5() # 1.生成一个md5对象
  5. a = a.encode() # 2.将传入的原始数据转成二进制
  6. tool.update(a) # 3.对原始数据的二进制格式进行摘要加密
  7. print(tool.hexdigest()) # 4.获取加密后的16进制字符串
  8. print(tool.digest()) # 或者获取加密后的2进制字符串
  9.  
  10. encrypt('111111')

3.3 摘要算法升级之加盐

对原始数据加一个字符串,让原始数据和字符串一起加密,俗称“加盐”

  1. def encrypt(data, salt):
  2. tool = hashlib.md5() # 1.生成一个md5对象
  3. final_data = data + salt # 2.对原始数据进行加盐
  4. final_data = final_data.encode() # 3.加盐后的数据转成二进制
  5. tool.update(final_data) # 4.加盐二进制进行摘要加密
  6. print(tool.hexdigest()) # 5.获取加密后的16进制字符串
  7. print(tool.digest()) # 或者获取2进制字符串
  8.  
  9. encrypt('111111', '111')
  10. # bbb8aae57c104cda40c93843ad5e6db8
  11. # b'\xbb\xb8\xaa\xe5|\x10L\xda@\xc98C\xad^m\xb8'

另一种写法

  1. def encrypt(data, salt):
  2. final_data = data + salt
  3. final_data = final_data.encode()
  4. encrypt_data = hashlib.md5(final_data)
  5. print(encrypt_data.hexdigest())
  6. print(encrypt_data.digest())
  7.  
  8. encrypt('111111', '111')
  9. # bbb8aae57c104cda40c93843ad5e6db8
  10. # b'\xbb\xb8\xaa\xe5|\x10L\xda@\xc98C\xad^m\xb8'

3.4 摘要算法的含义

摘要算法不是加密算法

加密算法的含义是:可以对原数据进行加密,并且可以对加密后的数据进行解密

摘要算法的含义是:单向加密,没有办法解密

4. 日志模块logging

模板

  1. import logging
  2. import logging.config
  3.  
  4. # 定义日志输出格式 开始
  5. standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
  6. '[%(levelname)s][%(message)s]' # 其中name为getlogger指定的名字
  7. simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
  8. # 定义日志输出格式 结束
  9.  
  10. # 自定义文件路径
  11. logfile_path = 'rizhi.log'
  12.  
  13. # log配置字典
  14. LOGGING_DIC = {
  15. 'version': 1,
  16. 'disable_existing_loggers': False,
  17. 'formatters': {
  18. 'standard': {
  19. 'format': standard_format
  20. },
  21. 'simple': {
  22. 'format': simple_format
  23. },
  24. },
  25. 'filters': {}, # 过滤日志
  26. 'handlers': {
  27. # 打印到终端的日志
  28. 'console': {
  29. 'level': 'DEBUG', # NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL
  30. 'class': 'logging.StreamHandler', # 打印到屏幕
  31. 'formatter': 'simple'
  32. },
  33. # 打印到文件的日志,收集info及以上的日志
  34. 'default': {
  35. 'level': 'DEBUG',
  36. 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
  37. 'formatter': 'standard',
  38. 'filename': logfile_path, # 日志文件
  39. 'maxBytes': 1024 * 1024 * 5, # 日志大小 5M
  40. 'backupCount': 5, # 保留最近5份
  41. 'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
  42. },
  43. },
  44. 'loggers': {
  45. # logging.getLogger(__name__)拿到的logger配置
  46. # 当键为空不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
  47. '': {
  48. 'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
  49. 'level': 'DEBUG',
  50. 'propagate': True,
  51. # 向上(更高level的logger)传递,如果上一个键值对的值是debug,那么可以向上打印warning的信息
  52. # 如果上有一个键值对的值是WARNING,那么不能向下打印debug的信息
  53. },
  54.  
  55. # '注册记录': {
  56. # 'handlers': ['console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
  57. # 'level': 'WARNING',
  58. # 'propagate': True, # 向上(更高level的logger)传递
  59. # }, # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
  60. },
  61. }
  1. # 使用日志字典配置
  2. # logging.config.dictConfig(LOGGING_DIC) # 自动加载字典中的配置
  3. # logger1 = logging.getLogger('转账记录')
  4. # logger2 = logging.getLogger('注册记录')
  5. # logger1.debug('阿根廷足球巨星梅西')
  6. # logger2.warning('法国足球巨星基利安姆巴佩')
  7.  
  8. # logging.config.dictConfig(LOGGING_DIC) # 自动加载字典中的配置
  9. # logger1 = logging.getLogger('withdraw record')
  10. # '''loggers配置中使用空字符串作为字典的键 兼容性最好!!!'''
  11. # logger1.debug('messi ronaldo neymar')
  12.  
  13. logging.config.dictConfig(LOGGING_DIC)
  14. a = logging.getLogger('注册信息')
  15. a.debug('ronaldo注册')
  1. # 定义产生日志的函数
  2. def get_logger(name='', ):
  3. '''
  4. :param name: 日志等级
  5. :return:
  6. '''
  7. # 初始化日志处理器 - 使用配置字典初始化日志处理器(将自定义配置加载到日志处理器中)
  8. logging.config.dictConfig(LOGGING_DIC)
  9. # 实例化日志处理器对象 - 并赋予日志处理器等级
  10. logger = logging.getLogger(name)
  11. # 返回日志生成对象
  12. return logger

16 模块time、datetime、random、hashlib、logging的更多相关文章

  1. Python常用模块(time, datetime, random, os, sys, hashlib)

    time模块 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp) :         通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运 ...

  2. Python常用模块time & datetime &random 模块

    时间模块前言 在Python中,与时间处理有关的模块就包括:time,datetime 一.在Python中,通常有这几种方式来表示时间: 时间戳 格式化的时间字符串 元组(struct_time)共 ...

  3. python---基础知识回顾(四)(模块sys,os,random,hashlib,re,序列化json和pickle,xml,shutil,configparser,logging,datetime和time,其他)

    前提:dir,__all__,help,__doc__,__file__ dir:可以用来查看模块中的所有特性(函数,类,变量等) >>> import copy >>& ...

  4. python模块(shelve,xml,configparser,hashlib,logging)

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

  5. python开发模块基础:异常处理&hashlib&logging&configparser

    一,异常处理 # 异常处理代码 try: f = open('file', 'w') except ValueError: print('请输入一个数字') except Exception as e ...

  6. time,datetime,random,os,sys,hashlib,logging,configparser,re模块

    #-----time模块----- print(help(time)) #打印time帮助文档 print(time.time()) #打印时间戳 1569824501.6265268 time.sl ...

  7. (九)random、os、time、datetime、hashlib、pymysql、excel、sys、string相关模块

    1.random模块 1 import random,string 2 print(string.printable) #代表所有的 数字+字母+特殊字符 3 4 print(random.randi ...

  8. 【python】-- 模块、os、sys、time/datetime、random、logging、re

    模块 模块,用一堆代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个 ...

  9. Python——常用模块(time/datetime, random, os, shutil, json/pickcle, collections, hashlib/hmac, contextlib)

    1.time/datetime 这两个模块是与时间相关的模块,Python中通常用三种方式表示时间: #时间戳(timestamp):表示的是从1970年1月1日00:00:00开始按秒计算的偏移量. ...

  10. 模块讲解---time模块,datetime模块,random模块,hashlib模块和hmac模块,typing模块,requests模块,re模块

    目录 1. 包 2. time模块   1. 优先掌握 2. 了解 3. datetime模块   1. 优先掌握 4. random模块   1. 优先掌握   2. 了解 5. hashlib模块 ...

随机推荐

  1. Charles抓包配置、常见问题和解决方法

    1.下载安装charles,官方下载地址:https://www.charlesproxy.com/download/ 如图,下载所对应系统需要的相应版本即可. 2.解压Charles包,双击Char ...

  2. 后端说,单页面SPA和前端路由是怎么回事

    没有请求的路由 在传统开发中,浏览器点击一个超链接,就会像后端web服务器发送一个html文档请求,然后页面刷新.但开始单页面开发后,就完全不同了. 单页面?这个概念难以理解.我用一个js作为整个we ...

  3. Jmeter函数助手28-urldecode

    urldecode函数用于解码application/x-www-form-urlencoded字符串. String to encode in URL encoded chars:填入applica ...

  4. 【MySQL】字符联合主键过长 Specified key was too long; max key length is 767 bytes

    MySQL版本: 这个情况在 8.0.28版本没有出现 报错如图 建表SQL: DROP TABLE IF EXISTS `pt_dict_common`; CREATE TABLE `pt_dict ...

  5. linux测试cpu性能的命令

    linux测试cpu性能的命令 在Linux中,可以使用多种命令来测试CPU性能.以下是一些常用的命令: stress: 一个通用的压力测试工具,可以生成CPU.内存.IO等负载. 安装: sudo ...

  6. Google的TPU的逐元素操作特性 —— TPU数据操作时最基本的操作原语(primitive)

    地址: https://jax.readthedocs.io/en/latest/pallas/tpu.html TPU是原来进行矩阵计算加速的一个科学计算的设备,功能大致等同于NVIDIA的GPU的 ...

  7. 在计算框架MindSpore中手动保存参数变量(Parameter 变量)—— from mindspore.train.serialization import save_checkpoint

    本文参考内容: https://www.mindspore.cn/doc/programming_guide/zh-CN/r1.2/advanced_usage_of_checkpoint.html? ...

  8. Python 将Word转换为JPG、PNG、SVG图片

    将Word文档以图片形式导出,既能方便信息的分享,也能保护数据安全,避免被二次编辑.文本将介绍如何使用Spire.Doc for Python 库在Python程序中实现Word到图片的批量转换. P ...

  9. JNA使用入门

    JNA即Java Native Access. 官方主页 代码仓库 官方样例 maven中心仓库主页 官方文档 Getting Started Functional Description. Mapp ...

  10. WM_LBUTTONDOWN,WM_LBUTTONUP

    WM_LBUTTONDOWN //鼠标左键按下消息WM_LBUTTONUP //鼠标左键弹起消息参数和按下一样 当用户在窗口的客户区域中按住鼠标左键时,会发布WM_LBUTTONDOWN消息.如果未捕 ...