Python连接外部数据库生成QR Code时遇FileNotFoundError及路径问题
解决FileNotFoundError并将QR Code保存到指定目录
错误原因分析
从报错信息No such file or directory: '0001-87L58/1.eps'能直接定位核心问题:
- Windows系统的文件名绝对不允许包含
/,你的PIN值里带有/,系统会把它当成路径分隔符,误以为要在0001-87L58这个不存在的文件夹下创建1.eps,因此触发了FileNotFoundError。 - 原代码没有指定外部保存目录,默认会把文件存在脚本运行的当前目录,若要保存到其他位置,必须明确写出完整路径。
解决方案步骤
- 清理PIN中的非法文件名字符:把
/替换成合法字符(比如_),同时可以批量处理其他常见非法字符(如: * ? " < > |)。 - 确保目标目录存在:如果指定的外部目录还没创建,先自动生成它,避免目录不存在导致的二次报错。
- 优化EPS生成逻辑:原代码两次调用
qr.eps会重复写入同一个文件,把所有参数合并成一次调用更高效。
修改后的完整代码
import pymssql, pyqrcode, os # 配置数据库连接信息 host = "myHost" username = "Mine" password = "mine#$" database = "external" # 配置QR Code保存的外部目录(自行修改为你需要的实际路径) save_dir = r"D:\Generated_QR_Codes" # 确保目标目录存在,不存在则自动创建 if not os.path.exists(save_dir): os.makedirs(save_dir) # 连接数据库并查询数据 conn = pymssql.connect(host, username, password, database) read_query = "SELECT * FROM dbo.M_tblPIN WHERE TI = 'A01'" mycursor = conn.cursor() mycursor.execute(read_query) result = mycursor.fetchall() # 生成并保存QR Code for item in result: PIN = item[12] # 批量清理所有Windows文件名非法字符 invalid_chars = '<>:"/\\|?*' cleaned_pin = PIN for char in invalid_chars: cleaned_pin = cleaned_pin.replace(char, '_') # 拼接完整的保存路径(自动适配系统路径分隔符) save_path = os.path.join(save_dir, f"{cleaned_pin}.eps") # 生成QR Code并一次性写入所有参数 qr = pyqrcode.create(PIN) print(qr) qr.eps(save_path, scale=5, module_color='#36C', background='#eee') # 关闭数据库连接 conn.close()
关键改动说明
- 使用
os.path.join()拼接路径:自动适配Windows的\路径分隔符,避免手动拼接时出现格式错误。 - 批量替换非法字符:覆盖所有Windows禁止的文件名字符,避免后续遇到其他类似报错。
- 合并
qr.eps()调用:把scale、module_color、background参数放在一次调用里,既避免重复写入文件,也让代码更简洁。
内容的提问来源于stack exchange,提问作者Shegmatech
相关产品推荐
相关产品推荐

