我的知识记录

Python 批量生成二维码:从 CSV 读取数据一键出图

Python 用 qrcode 库结合 CSV 表格批量生成二维码图片,一行数据对应一张 PNG,文件命名自动规范化,适合活动物料、员工工牌、产品标签场景。

场景痛点

活动要发 500 个带唯一链接的二维码、仓库要给每个商品贴条码标签、展会要给每个嘉宾生成专属入场码,在线工具一张张点不现实。把数据整理成 CSV,Python 读一行生成一张图,几分钟就能跑完几千个,还能按规则命名、统一配色。

用到的库

pip install qrcode[pil]

完整代码

import csv
import os
import qrcode


def make_qr(data, save_path, box_size=10, border=2):
"""生成单张二维码 PNG"""
qr = qrcode.QRCode(
version=None,
error_correction=qrcode.constants.ERROR_CORRECT_M,
box_size=box_size,
border=border,
)
qr.add_data(data)
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
img.save(save_path)


def sanitize(name):
"""把文件名里不合法字符替换掉"""
for ch in r'\/:*?"<>|':
name = name.replace(ch, "_")
return name.strip()


def batch_from_csv(csv_path, output_dir):
"""从 CSV 批量生成二维码
CSV 列约定:code, content, filename
code: 文件主键(如员工号/订单号)
content: 二维码里要存的内容(URL/文本)
filename: 可选,自定义文件名
"""
os.makedirs(output_dir, exist_ok=True)
success = 0
skipped = 0

with open(csv_path, "r", encoding="utf-8-sig", newline="") as f:
reader = csv.DictReader(f)
for row in reader:
code = (row.get("code") or "").strip()
content = (row.get("content") or "").strip()
filename = (row.get("filename") or "").strip()

if not content:
print(f"跳过空行 code={code}")
skipped += 1
continue

name = filename or code or content[:20]
safe_name = sanitize(name) + ".png"
path = os.path.join(output_dir, safe_name)

try:
make_qr(content, path)
print(f"OK  {safe_name}  <-  {content}")
success += 1
except Exception as e:
print(f"FAIL {safe_name}: {e}")
skipped += 1

print(f"\n完成:成功 {success} 张,跳过 {skipped} 张,输出目录:{output_dir}")


def main():
# 准备一份示例 CSV(也可以直接用你自己的)
sample_csv = "qrcodes.csv"
if not os.path.exists(sample_csv):
with open(sample_csv, "w", encoding="utf-8-sig", newline="") as f:
w = csv.writer(f)
w.writerow(["code", "content", "filename"])
w.writerow(["E001", "https://example.com/user/E001", "emp_001"])
w.writerow(["E002", "https://example.com/user/E002", "emp_002"])
w.writerow(["E003", "https://example.com/user/E003", "emp_003"])

batch_from_csv(sample_csv, output_dir="qr_output")


if __name__ == "__main__":
main()

代码讲解

  • CSV 用 utf-8-sig 编码读取,兼容 Excel 另存的带 BOM 中文 CSV,避免第一列表头乱码。
  • csv.DictReader 按列名取值,比按列下标更稳,CSV 列顺序变了也不影响。
  • sanitize 函数把文件名里 Windows 不允许的字符 \/:*?"<>| 替换成下划线,防止写文件报错。
  • os.makedirs(output_dir, exist_ok=True) 自动建输出目录,不用手动先建。
  • 出错时 try/except 兜住,单张失败不影响整批任务。

运行结果

第一次运行会自动生成一份示例 qrcodes.csv,然后在 qr_output/ 目录下输出 emp_001.pngemp_002.pngemp_003.png 三张二维码,每张扫码后跳转到对应 URL。把你自己的 CSV 替换进去,列名保持 code,content,filename 即可。

注意事项

  • 文件名别太长,Windows 路径总长不要超过 260 字符。
  • 批量生成时如果图片要打印,建议把 box_size 调到 12-16,保证打印出来清晰。
  • 内容里如果有换行或特殊字符,CSV 要用引号包起来,csv 模块会自动处理。
  • 同一批二维码建议统一配色,后期批量改色可以改 make_qr 里的 fill_color
  • 几千张以上建议加进度条:from tqdm import tqdm 包一层循环。

Python 批量生成二维码:从 CSV 读取数据一键出图

标签:

更新时间:2026-09-14 20:44:33

上一篇:Python 批量生成 UUID:uuid4 生成唯一标识写入文件

下一篇:Python 批量压缩图片体积:在清晰度和大小之间找平衡