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

如何使用Python生成文件名递增的二维码.png文件?解决批量生成时的空文件与写入错误问题

解决二维码批量生成的空文件与报错问题

我来帮你分析下问题出在哪,以及怎么修复:

问题根源拆解

你遇到的两个核心问题:

  1. 循环变量被覆盖:在for i in test.keys()循环里,你又给i = 0赋值,直接覆盖了原本代表字典键的i,导致文件名递增逻辑和字典数据完全脱节,还会让每次循环都从0开始找文件名。
  2. 文件打开模式错误:你用open("pic%s.png" % i, "w")以文本模式打开文件,但二维码图片是二进制数据,文本模式只能写入字符串,这就是报错'write() argument must be str, not bytes'的原因。而且其实qrcode的save方法可以直接接收文件名,根本不需要手动打开文件。

修正后的完整代码

下面是调整后的批量生成代码,保留了你原本的二维码内容格式,还优化了文件名查找逻辑:

import cv2
import os
import qrcode

test = {
    1: {"gene": "aox1a", "construct": "2-23", "line": "8"},
    2: {"gene": "aox1a", "construct": "2-23", "line": "8 "},
    3: {"gene": "aox1a", "construct": "2-23", "line": "8"}
}

# 初始化文件名计数器,避免重复覆盖已有文件
file_num = 0
for plant_id, plant_info in test.items():
    # 保留你原本的内容格式:说明文本 + 字典数据
    data = f"This is plant {plant_id}", plant_info
    
    # 找到第一个未被使用的文件名
    while os.path.exists(f"pic{file_num}.png"):
        file_num += 1
    filename = f"pic{file_num}.png"
    
    # 生成并保存二维码
    img = qrcode.make(data)
    img.save(filename)
    
    print(f"已成功生成: {filename},内容为: {data}")
    file_num += 1  # 优化:生成后直接递增,减少下次循环的重复检查

关键调整说明

  • 用test.items()遍历字典,同时获取植物ID(原字典键)和对应信息,避免了循环变量被覆盖的问题。
  • 把文件名计数器改成独立的file_num,和循环的plant_id彻底分开,逻辑更清晰。
  • 直接调用img.save(filename),qrcode库会自动以二进制模式处理文件写入,不用手动打开文件,避免了模式错误。
  • 保留了你原本的二维码内容结构(说明文本+字典数据),如果不需要说明文本,直接把data设为plant_info即可。

内容的提问来源于stack exchange,提问作者N.Brue

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 05:04:06