首页 > 其他分享 >16 模块time、datetime、random、hashlib、logging

16 模块time、datetime、random、hashlib、logging

时间:2024-08-03 19:51:14浏览次数:14  
标签:hashlib logging 16 random datetime tm 时间 time print

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秒)起至现在的总秒数。

import time  # 导入time模块

a = time.time()  # 生成时间戳,时间戳是浮点数类型
print(a, type(a))  # 1722591376.9927173 <class 'float'>
(2)时间戳转换为时间元组(UTC时间)     国际时间

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

import time

b = time.time()  # 生成时间戳
c = time.gmtime(b)  # 时间戳转换为时间元组类型
print(c, type(c))
# 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小时=北京时间

import time

a = time.time()
b = time.localtime(a)
print(b)
# 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)

符号    含义              值
%y    两位数的年份表示    (00-99)
%Y    四位数的年份表示    (000-9999)
%m    月份              (01-12)
%d    月内中的一天      (0-31)
%H    24小时制小时数     (0-23)
%I    12小时制小时数     (01-12)
%M    分钟数            (00=59)
%S    秒               (00-59)
%a    本地简化星期名称    
%A    本地完整星期名称    
%b    本地简化的月份名称    
%B    本地完整的月份名称    
%c    本地相应的日期表示和时间表示    
%j    年内的一天       (001-366)
%p    本地A.M.或P.M.的等价符    
%U    一年中的星期数    (00-53)星期天为星期的开始
%w    星期            (0-6),星期天为星期的开始
%W    一年中的星期数    (00-53)星期一为星期的开始
%x    本地相应的日期表示    
%X    本地相应的时间表示    
%Z    当前时区的名称    
%%    %号本身    
import time

# 时间元组放或不放都行
a = time.strftime('%Y-%m-%d %H:%M:%S')
print(a)  # 2024-08-02 18:09:09
b = time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime())
print(b)  # 2024-08-02 10:09:09
c = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
print(c)  # 2024-08-02 18:09:09

d = time.strftime('%c')
print(d)  # Fri Aug  2 18:09:09 2024

1.1.3 时间元组(struct_time)

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

import time

print(time.localtime())
# 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     时间元组--->时间戳

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

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

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

import time

print(time.strftime("%Y-%m-%d ", time.localtime()))
# 2024-08-02 
print(time.strftime("%H:%M:%S ", time.localtime()))
# 18:50:35

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

import time

print(time.strptime('2022-02-28 09:22:05', '%Y-%m-%d %H:%M:%S'))
# 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    时间元组--->标准的时间格式

import time

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

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

import time

print(time.ctime(time.time()))  # Fri Aug  2 19:08:23 2024
print(time.ctime())  # Fri Aug  2 19:08:23 2024

1.1.4 小结

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

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

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

 1.2 datetime模块

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

import datetime

a = datetime.date(2023, 11, 20)
print(a)  # 2023-11-20

(2)获取当地时间

年月日

import datetime

print(datetime.date.today())  # 2024-08-02

年月日时分秒

import datetime

a = datetime.datetime.today()
print(a)  # 2024-08-02 19:43:42.946123

# 以以上时间a为基础,可以得到更加具体的数据
print(a.year)  # 2024
print(a.month)  # 8
print(a.day)  # 2
print(a.hour)  # 19
print(a.minute)  # 46
print(a.second)  # 30
print(a.weekday)  # 星期(weekday星期是0-6) 0表示周一
print(a.isoweekday)  # 获取星期(weekday星期是1-7) 1表示周一

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

打印时间增减

import datetime

# 生成一个时间数据,可以对日期进行加减
ahead_day = datetime.timedelta(days=2)
print(ahead_day)  # 2 days, 0:00:00

delay_day = datetime.timedelta(days=3)
print(delay_day)  # 3 days, 0:00:00

对日期进行增减

import datetime

# 打印当前时间提前2天的具体时间
ahead_day = datetime.timedelta(days=2)
print(datetime.datetime.today() - ahead_day)  # 2024-07-31 19:57:35.348771

# 打印当前时间往后3天的具体时间
delay_day = datetime.timedelta(days=3)
print(datetime.datetime.today() + delay_day)  # 2024-08-05 19:59:09.937551

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

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

2. 随机模块random

import random

# 1.随机生成0~1之间的小数 random
a = random.random()
print(a)  # 0.46371291740686915

# 2.生成指定区间的小数  uniform
b = random.uniform(1, 2)
print(b)  # 1.90434431469814

# 3.随机区间整数,两侧都可以取到  randint
c = random.randint(11, 13)
print(c)  # 13

# 4.随机区间整数,要考虑起始值和步长  randrange
d = random.randrange(1, 10, 2)
print(d)  # 1,3,5,7,9中取一个数

# 5.随机返回列表的一个元素   choice
e = ['messi', 'ronaldo', 'neymar', 'kylian']
print(random.choice(e))  # messi

# 6.随机返回列表指定个数元素  sample
f = ['messi', 'ronaldo', 'neymar', 'kylian', 'haaland']
print(random.sample(f, 2))
# ['neymar', 'haaland']

# 7.打乱列表顺序,作用在原列表上  shuffle
g = [1, 2, 3, 4, 5, 6, 7, 8, 9]
random.shuffle(g)
print(g)  # [1, 6, 8, 4, 5, 7, 3, 2, 9]

random模块的应用场景

# chr方法:根据ASCII码表的顺序,传入数字以展示对应的字符
import random

print(chr(65))  # A
print(chr(90))  # Z
print(chr(97))  # a
print(chr(122))  # z

# 生成一个6位数的随机验证码
def identify_code(n):
    code = ''  # 初始为空,循环一次字符串个数加一个
    for i in range(n):  # 定义循环的次数
        upper_case = chr(random.randint(65, 90))
        lower_case = chr(random.randint(97, 122))
        num = str(random.randint(0, 9))
        code += random.choice([upper_case, lower_case, num])  # 每次循环在大小写、数字中随机取一个
    return code

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算法

import hashlib

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

encrypt('111111')

 3.3 摘要算法升级之加盐

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

def encrypt(data, salt):
    tool = hashlib.md5()  # 1.生成一个md5对象
    final_data = data + salt  # 2.对原始数据进行加盐
    final_data = final_data.encode()  # 3.加盐后的数据转成二进制
    tool.update(final_data)  # 4.加盐二进制进行摘要加密
    print(tool.hexdigest())  # 5.获取加密后的16进制字符串
    print(tool.digest())  # 或者获取2进制字符串

encrypt('111111', '111')
# bbb8aae57c104cda40c93843ad5e6db8
# b'\xbb\xb8\xaa\xe5|\x10L\xda@\xc98C\xad^m\xb8'

另一种写法

def encrypt(data, salt):
    final_data = data + salt
    final_data = final_data.encode()
    encrypt_data = hashlib.md5(final_data)
    print(encrypt_data.hexdigest())
    print(encrypt_data.digest())


encrypt('111111', '111')
# bbb8aae57c104cda40c93843ad5e6db8
# b'\xbb\xb8\xaa\xe5|\x10L\xda@\xc98C\xad^m\xb8'

3.4 摘要算法的含义

摘要算法不是加密算法

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

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

4. 日志模块logging

 

标签:hashlib,logging,16,random,datetime,tm,时间,time,print
From: https://www.cnblogs.com/hbutmeng/p/18339230

相关文章

  • 计算机基础(Windows 10+Office 2016)教程 —— 第7章 演示文稿软件PowerPoint 2016
    第7章演示文稿软件PowerPoint20167.1PowerPoint2016入门7.1.1PowerPoint2016简介7.1.2PowerPoint2016的操作界面组成7.1.3PowerPoint2016的窗口视图方式7.1.4PowerPoint2016的演示文稿及其操作7.1.5PowerPoint2016的幻灯片及其操作7.2演示文稿的编......
  • 计算机基础(Windows 10+Office 2016)教程 —— 第8章 多媒体技术及应用
    多媒体技术及应用8.1多媒体技术的概述8.1.1多媒体技术的定义和特点8.1.2多媒体的关键技术8.1.3多媒体技术的发展趋势8.1.4多媒体文件格式的转换8.1.5多媒体技术的应用8.2多媒体计算机系统的构成8.2.1多媒体计算机系统的硬件系统8.2.2多媒体计算机系统的软......
  • OpenCV计算机视觉学习(16)——仿射变换学习笔记
    如果需要其他图像处理的文章及代码,请移步小编的GitHub地址传送门:请点击我如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice在计算机视觉和图像处理中,仿射变换是一种重要的几何变换方法。它可以通过线性变换和平移来改变图像的形状和位置,广泛应......
  • MATLAB(16)评价模型
    一、前言    在MATLAB中实现各种评价模型,如模糊评价、层次分析法(AHP)、综合评价模型、主成分分析(PCA)、数据包络分析(DEA,也称为数据包络分析或DataEnvelopmentAnalysis)和神经网络模型评价,需要编写相应的代码或使用MATLAB的内置函数和工具箱。下面我将为每种方法提供一......
  • Day16_1--JSP了解学习之EL表达式语言入门教程
    JSP(JavaServerPages)是一个用于生成动态网页的技术。EL(ExpressionLanguage)是JSP中的一种表达式语言,用于简化JSP页面中的Java代码,使其更易于书写和阅读。下面是对JSPEL表达式语言的简要介绍。1.什么是EL?EL(表达式语言)是JSP2.0引入的一种语言,它提供了一种简单的方法来访......
  • gym105167E Erdős-Ginzburg-Ziv 题解
    题意:给\(p\)和\(p-1\)个边权,要用这些边权构造树,每个点编号\(0\simp-1\),使得每个点\(u\)到\(0\)的距离\(\bmod\p=u\),无解输出-1,保证\(p\)是质数、\(p\le10^6\)、边权\(\in[1..p-1]\).Solution考虑加边的过程,树最开始只有根节点0,然后通过加边不断地引入新的点......
  • 如何在python中通过requests和opencv加载uint16 png文件
    我正在尝试从URL自动加载图像,然后将其加载到numpy矩阵。为此,我需要使用requests和opencv库。对于像uint8这样编码的标准图像,它以正确的方式工作,并且由于值溢出而损坏了uint16图像。这是我现在正在使用的一个简单的最小代码:importrequestsimportcv2importnumpy......
  • 文心一言 VS 讯飞星火 VS chatgpt (316)-- 算法导论22.3 8题
    八、请给出如下猜想的一个反例:如果有向图G包含一条从结点u到结点v的路径,并且在对图G进行深度优先搜索时有u.d<v.d,则结点v是结点u在深度优先森林中的一个后代。如果要写代码,请用go语言。文心一言:为了提供一个反例,我们需要考虑深度优先搜索(DFS)的特性,并构造一个图,其中存在从......
  • day16 Java基础——JavaDoc生成文档
    day16Java基础——JavaDoc生成文档目录day16Java基础——JavaDoc生成文档1.什么是JavaDoc2.生成JavaDoc2.1通过命令行生成JavaDoc2.2使用IDEA生成JavaDoc1.什么是JavaDocJavaDoc是一种标准的、用于生成Java代码API文档的工具。它通过在Java源代码中特定的......
  • Educational Codeforces Round 168 (Rated for Div. 2)A——D题解
    EducationalCodeforcesRound168(RatedforDiv.2)A——D题解A.StrongPassword题意:给一个小写字符串密码,添加一个小写字母,使得密码更加复杂。题解:有相同的相邻的字母,再其中间添加不同的字母;如果没有相同的相邻的字母,则最后添加一个字母。#include<bits/stdc++.h>......