day_15补充加总结

博客介绍了Python的hashlib提供的摘要算法,如MD5、SHA1等。摘要算法能将任意长度数据转换为固定长度数据串,可用于判断原始数据是否被篡改。还给出了利用Python计算文件MD5值的简写代码,提及判断文件相同靠MD5值,以及相关应用例题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hashlib 模块

 Python的hashlib提供了很多摘要算法,如MD5,SHA1等常用算法。

  什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(如MD5值共32位,且每位都是用16进制进行表示)。

    摘要算法就是通过摘要函数对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。

    摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算digest很容易,但通过digest反推数据data却非常困难,并且对原始数据做出任意的修改都会导致计算出的digest完全不同。

  综上所述,只要是一个完整且未被修改过的文件,它的MD5值或者其他算法值都是固定不变的,一旦计算出数值与原作者给出的数值不同,就要当心此文件的安全性了。

     那么,利用python怎么计算一个文件的MD5值呢?

     以下是简写代码:

import hashlib
                                 
def match(file)                     
    md5 = hashlib.md5()              #创建一个md5算法对象
    with open('file','rb') as f1:       # 打开你传入的文件
          data == f1.read(1024):    #如果文件较大,就会读爆内存,所以1以1024个单位读一次
          if data :                           #如果读出来的data不为空                        
              md5.upadate(data)       # 就uadata 
          else:
                break                         #否则空了 就退出 ,就是读完的意思
    ret = md5.hexfigest()               #获取此时的md5值
    return ret                               # 返回md5值 
match(file)                                  #调用

      判断一个文件是否相同就是靠md5值相同判断

  求文件大小

# import os
# def func(a,sum=0):
#     li = os.listdir(a)
#     for i in li:
#         if os.path.isfile(os.path.join(a,i)):
#             sum += os.path.getsize(os.path.join(a,i))
#         elif os.path.isdir(os.path.join(a,i)):
#             sum += func(os.path.join(a,i),sum)
#     else:
#         return sum
# c = func('D:\_S20\作业\答案\day_11')
# print(c)
 1 import os
 2 total_size=0
 3 def file_size(path):
 4     global total_size
 5     path=os.path.abspath(path)
 6     file_list=os.listdir(path)
 7     for i in file_list:
 8         i_path = os.path.join(path, i)
 9         if os.path.isfile(i_path):
10             total_size += os.path.getsize(i_path)
11         else:
12             try:
13                 file_size(i_path)
14             except RecursionError:
15                 print('递归操作时超出最大界限')
16     return total_size
17 
18 
19 print(file_size('D:\\红军不怕远征难\\苍老师精彩集锦')

 

    切记绝对路径跟相对路径,求文件大小要路径名为父文件名加现在所生成的绝对路径

      random 模块

     应用例题

     微信红包

      

# # 设置红包价格:
import random

pocket = int(input('请输入你要发多大的红包').strip())
num = int(input('请输入你要发多少个包').strip())
def func(pocket,num):
    li = []
    lis1 = []
    for i in random.sample(range(1, pocket), k=num-1):
        li.append(i)
    lis = sorted(li)
    print(lis)
    for j in range(0,len(lis)):
        if j == len(lis)-1:
            break
        lis1.append(lis[j+1] - lis[j])
    lis1.append(pocket-lis[-1])
    lis1.append(lis[0])
    return lis1
print(func(pocket,num))
#常用模块
#时间模块
#time
# time是datetime的底层模块
# 时间戳
# 结构化
# 格式化时间
# 结构化 = time.localtime(时间戳) 反向mktime
# 字符串 = strftime(结构化) 反向 strptime
#datetime
# 时间对象
# 计算时间差(timedelta)、时间的时分秒
# import datetime
# t = datetime.datetime.now()
# print(t.date())
# print(t.time())
# print(t.timestamp())
# print(t.day)
# print(t.month)

 


# collections
# Counter
# 可命名元祖 nametuple/time.struct
# 双端队列 deque
# 默认字典 defaultdict

from collections import Iterable,Iterator,defaultdict
# print(isinstance(open('a','w'),Iterator))
# print(isinstance(open('a','w'),Iterable))
# dic = defaultdict(lambda :5) 参数是可调用对象
# dic = defaultdict() ## defaultdict(None, {})
# print(dic)

 


# 双端队列和列表的区别
# 效率,底层的数据结构上
# 列表是 在开头加东西,集体地址往后挪一步
# 双端队列 从中间插入或者删除比较频繁的时候
# 如果只是单纯的append和pop再加上查询比较多,这个时候用列表

转载于:https://www.cnblogs.com/CNHK1949/p/10569915.html

<think>我们正在修改SQL语句,将固定日期条件改为动态计算过去一周的数据。原始SQL语句中的条件可能是:`WHEREdate_column>='2025-05-01'`,我们需要将其改为过去一周(即从当前日期往前推7天)。在SQL中,我们可以使用日期函数来实现动态计算。根据引用[1]中的函数,我们可以使用:-CURDATE()获取当前日期-DATE_SUB()减去一个时间间隔因此,将固定日期改为过去一周(即从当前日期的前一天开始往前推7天,通常我们说的过去一周是指从7天前到昨天?还是到今天?这里需要明确。不过常见的统计需求是:-过去7天(包含今天):从当前日期往前推6天,即从(当前日期-6天)到当前日期。但注意,如果包含今天,则今天的可能数据还不完整,有时只计算到昨天。-或者,过去7天(不包含今天):从(当前日期-7天)到(当前日期-1天)。由于用户没有特别说明,我们通常认为过去一周是指截止到昨天的7天数据,即不包含今天。但也要看业务需求。这里我们假设需要统计的是从7天前开始(包括7天前的那一天)直到昨天的数据(即过去7个完整日的数据)。我们可以这样写:`WHEREdate_columnBETWEENDATE_SUB(CURDATE(),INTERVAL7DAY)ANDDATE_SUB(CURDATE(),INTERVAL1DAY)`但是,请注意,这种写法包括了两端的日期。另一种写法是:`WHEREdate_column>=DATE_SUB(CURDATE(),INTERVAL7DAY)ANDdate_column< CURDATE()`这样,从7天前的0点开始(包括7天前)到昨天结束(因为`date_column< CURDATE()`,即不包括今天)。由于我们不知道原始SQL语句的具体结构,这里给出一个通用的修改方式。例如,原SQL可能是:SELECT...WHEREdate_column>='2025-05-01'AND...我们将其改为:SELECT...WHEREdate_column>=DATE_SUB(CURDATE(),INTERVAL7DAY)ANDdate_column< CURDATE()AND...或者,如果数据库支持使用`BETWEEN`,也可以写成:SELECT...WHEREdate_columnBETWEENDATE_SUB(CURDATE(),INTERVAL7DAY)ANDDATE_SUB(CURDATE(),INTERVAL1DAY)注意:第二种用`BETWEEN`的方式是包含边界的,所以会包括7天前和昨天的数据。另外,有些数据库可能使用不同的日期函数。但根据引用[1],我们使用的函数是MySQL的函数(因为引用了CURDATE(),DATE_SUB等)。如果数据库不是MySQL,则可能需要调整(比如在SQLServer中,可以用DATEADD和GETDATE)。但用户没有说明数据库类型,而且引用中给出的函数是MySQL的,所以我们默认使用MySQL。因此,我们将原SQL中的固定日期替换为动态计算过去一周的表达式。现在,假设用户的原始SQL语句中有类似`date_column>='2025-05-01'`的条件,我们可以将其替换为上面两种之一。为了明确起见,我们选择第一种:使用`>=`和`<`的方式,因为这样更常见,并且能避免时间部分的影响(例如,如果字段是日期时间类型,那么`BETWEEN`当日期是精确到时分秒时可能会有问题)。所以我们这样写:原条件:`date_column>='2025-05-01'`修改后:`date_column>=DATE_SUB(CURDATE(),INTERVAL7DAY)ANDdate_column< CURDATE()`注意:这里假设`date_column`是日期或日期时间类型。如果是日期时间类型,那么`CURDATE()`返回的是当前日期(不含时间),所以`date_column< CURDATE()`等价于`date_column<今天0点`,即不包括今天。这样,我们就能获取到过去7天的数据(不包括今天)。如果用户需要包含今天,则应该使用:`date_column>=DATE_SUB(CURDATE(),INTERVAL6DAY)ANDdate_column< DATE_ADD(CURDATE(),INTERVAL1DAY)`但这样今天的数据也包括了(从今天0点到现在)。但是,由于用户要求过去一周,通常不包括今天,因为今天还没过完。根据问题,我们采用不包含今天的做法。因此,修改SQL语句时,将固定日期替换为动态计算过去一周的条件(过去7个完整日)。另外,如果原始SQL中还有其他条件,需要保留。所以,最终修改后的SQL语句可能会是:原始SQL(假设):SELECT*FROMsalesWHEREsale_date>='2025-05-01';修改后:SELECT*FROMsalesWHEREsale_date>=DATE_SUB(CURDATE(),INTERVAL7DAY)ANDsale_date< CURDATE();注意:如果原始条件中还有结束日期,例如`ANDsale_date<='2025-05-10'`,那么我们需要去掉结束日期,因为我们只需要过去一周的数据,所以原来的结束日期就不再需要了。用户的问题只要求将开始日期改为动态过去一周,所以结束日期也要做相应调整。但实际上,原条件可能只有一个固定日期(作为开始),而结束日期可能是另一个固定日期,但现在我们不需要固定日期,而是动态范围。因此,我们需要完全替换时间条件。如果原SQL有多个时间条件,我们需要根据实际情况调整。但用户问题只提到将固定日期改为动态过去一周,所以我们默认只有一个时间条件用于筛选开始日期。总结:将条件改为动态计算过去一周(7天前到今天之前)的数据。现在,我们给用户一个示例:假设原SQL为:SELECTCOUNT(*)ascountFROMordersWHEREorder_date>='2025-05-01'修改后:SELECTCOUNT(*)ascountFROMordersWHEREorder_date>=DATE_SUB(CURDATE(),INTERVAL7DAY)ANDorder_date< CURDATE();如果用户需要包含今天,则需要另外调整。另外,根据引用[2],在Mybatis-Plus中可以直接在注解中使用这个动态SQL表达式,但注意Mybatis-Plus中写SQL时,如果使用字符串,则可以直接将表达式写入。例如:@Select("SELECTCOUNT(*)ascountFROMorders"+"WHEREorder_date>=DATE_SUB(CURDATE(),INTERVAL7DAY)"+"ANDorder_date< CURDATE()")intcountLastWeekOrders();这样,每次执行都会动态计算过去一周的数据。但是,如果原SQL是复杂的语句,比如有连接等,方法类似。所以,我们按照这个思路修改用户提供的SQL语句。请注意,用户的问题中并没有提供具体的SQL语句,所以以上是一个通用的修改方法。如果用户提供了具体的SQL,我们再具体修改。由于用户没有给出,我们就给出通用示例。</think> 根据您的需求,需要将 SQL 语句中的固定日期条件改为动态计算过去一周的数据。以下是修改方案及示例(以 MySQL 语法为例): ### 修改要点 1. **替换固定日期** `'2025-05-01'` → 动态计算过去一周的起始日期 2. **使用日期函数**:结合 `CURDATE()` 和 `DATE_SUB()` 实现动态计算 3. **时间范围调整**:`>= [过去7天的日期] AND < [明天]` 确保完整覆盖最近7天 ### 修改后的 SQL 模板 ```sql SELECT [字段] FROM [表名] WHERE [日期字段] >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) -- 起始日期:7天前 AND [日期字段] < DATE_ADD(CURDATE(), INTERVAL 1 DAY) -- 结束日期:明天0点(确保包含今天) ``` ### 具体示例 假设原 SQL 为: ```sql SELECT * FROM sales WHERE order_date >= '2025-05-01' ``` 修改后: ```sql SELECT * FROM sales WHERE order_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) -- 动态起始日期 AND order_date < DATE_ADD(CURDATE(), INTERVAL 1 DAY) -- 动态结束日期 ``` ### 关键函数说明 1. `CURDATE()`:返回当前日期(格式:`YYYY-MM-DD`) 2. `DATE_SUB(date, INTERVAL X DAY)`:从指定日期减去 X 天 3. `DATE_ADD(date, INTERVAL X DAY)`:向指定日期增 X 天 ### 补充说明 1. **不包含未来数据**:通过 `< DATE_ADD(CURDATE(), INTERVAL 1 DAY)` 避免包含未来日期 2. **跨月/年自动处理**:日期函数会自动处理月份/年份的变化 3. **时区考虑**:如需指定时区,可用 `CONVERT_TZ(CURDATE(), 'GMT', 'Your_Timezone')` > 注:在 MyBatis 中可直接将动态表达式写入注解(参考引用[2]): > ```java > @Select("SELECT * FROM sales WHERE order_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND order_date < DATE_ADD(CURDATE(), INTERVAL 1 DAY)") > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值