You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:12:04