python计算Content-MD5并获取文件的Content-MD5值方式
作者:茕夜 发布时间:2022-09-27 00:53:29
标签:python,Content,MD5
1、首先计算MD5加密的二进制数组(128位),然后再对这个二进制数组进行base64编码(而不是对32位字符串编码)。
例如,用Python计算0123456789的Content-MD5,主要代码如下:
import base64, hashlib
hash = hashlib.md5()
hash.update("0123456789")
base64.b64encode(hash.digest())
这样就生成了 'eB5eJF1ptWaXm4bijSPyxw==' 的Content-MD5值
2、接着,实际上如何获取文件的Content-MD5值呢,下面有两种不同的写法,建议用第一种,不知道为啥实际调试的时候,用第一种可以的时候,用第二种不可以,因为是不同人写的代码,估计调用的时候方式不一样:
(1)、第一种写法
import hashlib, base64
def content_encoding(path: str):
"""
文件转 bytes 加密并使用 base64 编码
:param path: 文件路径
:return: 返回加密编码后的字符串
"""
with open(path, 'rb') as f:
content = f.read()
content_md5 = hashlib.md5()
content_md5.update(content)
content_base64 = base64.b64encode(content_md5.digest())
return content_base64.decode("utf-8")
(2)、第二种写法:
import hashlib, base64
def match(file_path, Bytes=1024):
"""
先计算文件md5值,在对该md5值进行base64编码
:param file_path: 文件路径
:param Bytes: 字节大小
:return:
"""
try:
md5_1 = hashlib.md5() # 创建一个md5算法对象
with open(file_path, 'rb') as f: # 打开一个文件,必须是'rb'模式打开
while 1:
data = f.read(Bytes) # 由于是一个文件,每次只读取固定字节
if data: # 当读取内容不为空时对读取内容进行update
md5_1.update(data)
else: # 当整个文件读完之后停止update
break
f.close()
ret = base64.b64encode(bytes(md5_1.digest())) # 获取这个文件的MD5值
ret = ret.decode('ascii') # 去掉前面的b'
return ret
except Exception as e:
print(e)
return ''
补充知识:Python之文件处理-批量修改md文档内容
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
import re
import time
def modify_md_content(top):
for root, dirs, files in os.walk(top, topdown=False):
# 循环文件
for file_name in files:
file_name_split = file_name.split('.')
try:
if file_name_split[-1] == 'md':
# 找到md文件并且复制一份md文件路径
md_file_path = os.path.join(root, '.'.join(file_name_split))
copy_md_file_path = os.path.join(root, '.'.join([f'{file_name_split[0]}_copy', file_name_split[1]]))
# 打开md文件然后进行替换
with open(md_file_path, 'r', encoding='utf8') as fr, \
open(copy_md_file_path, 'w', encoding='utf8') as fw:
data = fr.read()
# data = re.sub('\(/配图/', '(配图/', data)
# data = re.sub('<br>', '<br>\n', data)
# data = re.sub('<br>', '', data)
data = re.sub('^ #.*? ', '', data)
fw.write(data) # 新文件一次性写入原文件内容
# fw.flush()
# 删除原文件
os.remove(md_file_path)
# 重命名新文件名为原文件名
os.rename(copy_md_file_path, md_file_path)
print(f'{md_file_path} done...')
time.sleep(0.5)
except FileNotFoundError as e:
print(e)
time.sleep(0.5)
if __name__ == '__main__':
top = r'/Users/mac/Desktop/'
modify_md_content(top)
来源:https://blog.csdn.net/u012561176/article/details/104021413


猜你喜欢
- 检查node的版本和gulp版本,最好使用nvm来管理node版本,本人遇到这两种版本匹配的时候会造成layaair2-cmd命令编译报错的
- 一、文件操作1.打开r+ 打开存在文件 文件不存在 报错file = open("user.txt","r+&
- 最近发现各大类库都能利用div.innerHTML=HTML片断来生成节点元素,再把它们插入到目标元素的各个位置上。这东西实际上就是inse
- Vue开发环境跨域访问其他服务器或者本机其他端口,需要配置项目中config/index.js文件,修改如下module.exports =
- 将近两个多月没有敲linux命令,手指头不听话了。该再次温习卖油翁的故事了。曾为oracle如何启动多个实例运行纠结过,不服输心理。当时在一
- 在工作中遇到把DataGrid中绑定的后台数据库数据展示给用户时把负数变为0的小问题,现在记录下来。例子中数据表示这个样子的:-------
- 一个简单的验证码爬取程序本文介绍了在Python2.7环境下爬取网站验证码:思路就是获取验证码对应的url,然后发起requst请求,读取该
- 自我描述的语句指这样一种语句:它的内容就是对它本身的描述。(废话……)比如下面这句句子:这是一段自我描述的语句,除了标点符号外,它共包含12
- 发现问题图片地址如下http://qximg.lightplan.cc/2016/09/11/1473574486942944.jpeg需要
- 前言django wsgi python有个自带的wsgi模块 可以写自定义web框架 用wsgi在内部创建socket对象就可以了 自己只
- 之前写的单向链表和环形链表都只是单向的,只能单向遍历,不能根据后面的节点获取前面的节点,除非进行反转操作。双向链表每个节点都有两个指针,这两
- 刚才画散点图要用到图例,可是matplotlib.pyplot.plot(x,y,'.')画出的散点图中图例是两个点(因为p
- 一、私有化上篇说过封装,既将我们不想让别人看到代码的内容,但是又需要用到的内容,通过类内部调用来实现调用。说到这里却不得不提一下上篇的:cl
- JavaScript在讲解用 Ts 遍历一个对象之前, 我们先说说 在 Js 中怎么实现, for...in、Object.keys, 一个
- 计算信息熵的公式:n是类别数,p(xi)是第i类的概率假设数据集有m行,即m个样本,每一行最后一列为该样本的标签,计算数据集信息熵的代码如下
- 上次谈到客户端和服务端的编码“陷阱”,其中对url编码只是提及带过,并没有做深入讨论,事实上由于浏览器环境的复杂和不一致性,我们也很容易掉进
- 核心播放模块(pygame内核)import time import pygameimport easygui as guifile = r
- 本文实例讲述了Python list列表中删除多个重复元素操作。分享给大家供大家参考,具体如下:我们以下面这个list为例,删除其中所有值为
- 自己写PHP也有一年多了,然后编码问题却老是没有得到好的解决,自己的情况是这样的,网页显示完全正常,在phpmyadmin数据库显示中文乱码
- 本文实例总结了MySQL单表查询常见操作。分享给大家供大家参考,具体如下:创建fruits表:CREATE TABLE fruits( f_