如何用tqdm跟踪文件加密/解密脚本中.write()的写入进度?
问题
我开发了一个对选定文件夹内文件进行加解密的脚本,核心操作是用.write()写入加密/解密后的字节数据。现在想给这个操作加上类似76%|███████ |的进度跟踪,已知tqdm工具,但网上只找到跟踪文件下载写入的示例,搞不懂它的pbar参数结构,也不知道怎么改造成本地文件.write()的进度跟踪版本。我试过把下载示例里的for data in resp.iter_content(chunk_size=1024):换成for data in b85_value:,但没成功。
附参考的tqdm下载示例:
import requests from tqdm import tqdm url = 'https://wordnetcode.princeton.edu/2.1/WNsnsmap-2.1.tar.gz' filename = url.split('/')[-1] resp = requests.get(url,stream=True) pbar = tqdm(desc=filename, total=int(resp.headers.get('content-length', 0)),unit='B', unit_scale=True, unit_divisor=1024,) with open(filename, 'wb') as f: for data in resp.iter_content(chunk_size=1024): f.write(data) pbar.update(len(data)) pbar.close()
我的目标代码片段:
#my block of code for filefolder, dirs, files in walk(input_dir): for filename in files: pbar = tqdm(desc=filename, .?. print(f"Encrypting {filename}..") try: with open(filefolder + "\\" + filename, 'rb') as encryptingfile: b85_bytes = b85encode(encryptingfile.read()) output_file = open(filefolder + "\\" + filename, 'wb') output_file.write(b85_bytes) #pbar.update() equivalent, which displays the progress output_file.write(b85_bytes) output_file.close() except PermissionError: print(f"\rSkipping: {filename}\n")
解决方案
要实现本地文件加密+写入的进度跟踪,关键是把一次性读写整文件改成分块处理,这样才能逐步更新进度条。具体实现如下:
修改后的完整代码:
import os from base64 import b85encode from tqdm import tqdm input_dir = "你的目标文件夹路径" chunk_size = 1024 * 1024 # 1MB分块,可根据需求调整 for filefolder, dirs, files in os.walk(input_dir): for filename in files: file_path = os.path.join(filefolder, filename) # 获取原文件大小,作为进度条总长度 file_size = os.path.getsize(file_path) # 初始化tqdm进度条:显示文件名、总大小、单位自动缩放 pbar = tqdm( desc=f"Encrypting {filename}", total=file_size, unit='B', unit_scale=True, unit_divisor=1024 ) try: # 分块读取原文件,加密后分块写入 with open(file_path, 'rb') as in_file, open(file_path, 'wb') as out_file: while True: # 读取一块数据 chunk = in_file.read(chunk_size) if not chunk: break # 读取完毕退出循环 # 加密当前块 encrypted_chunk = b85encode(chunk) # 写入加密后的块 out_file.write(encrypted_chunk) # 更新进度条:按原文件读取的字节数更新(也可以用encrypted_chunk的长度,看需求) pbar.update(len(chunk)) pbar.close() except PermissionError: pbar.close() # 遇到权限问题也要关闭进度条,避免显示混乱 print(f"\nSkipping: {filename} (权限不足)")
关键说明
- 之前尝试失败的原因:
b85_bytes是完整的字节对象,直接遍历会逐个字节处理,效率极低且未设置total参数,进度条无法计算完成比例,自然无法正常显示。 - 进度条total参数设置:这里用原文件大小作为总长度,更符合“原文件处理进度”的直观感知;如果想跟踪加密后文件的写入进度,可以按b85加密的膨胀比例(约25%)预估总大小,但分块场景下用原文件大小更简单直接。
- 分块大小调整:
chunk_size可根据文件大小和内存情况灵活调整,大文件可用更大分块(如10MB),小文件用小分块即可。
内容的提问来源于stack exchange,提问作者Constanted
相关产品推荐
相关产品推荐

