1. 程式人生 > 程式設計 >python計算Content-MD5並獲取檔案的Content-MD5值方式

python計算Content-MD5並獲取檔案的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('^ #.*? ',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)

以上這篇python計算Content-MD5並獲取檔案的Content-MD5值方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。