Python3从SQL表取数据后无法写入文本文件的问题排查
解决无法写入TXT文件的问题
咱们一步步排查你的代码问题,先揪出几个关键的坑:
1. 文件打开模式的隐形问题
你用'w'模式打开文件,这个模式的特性是每次打开都会清空文件原有内容。如果只调用一次addepc(),文件里只会写入当前选中的那个值;如果多次调用,之前的内容会被完全覆盖,看起来就像没写入一样。
如果想保留历史内容,应该用'a'(追加)模式;如果想每次保存整个epcs字典的状态,那用'w'模式但要把所有键值对都写进去,而不是只写当前的一个值。
2. SQL查询的语法错误
第二个查询里的as float写法不对——你想把value转成浮点数,但这里误把表的别名设成了float,这会导致查询逻辑异常(虽然可能没报错,但获取到的数据可能不符合预期)。正确的写法应该是用CAST函数转换字段类型:
SELECT CAST(value AS FLOAT) FROM epcval5 WHERE epc='EPC{}'
3. 字典键的类型不匹配
你初始化epcs的时候用的是整数键(0-18),但input()返回的是字符串类型,所以epcs[epcNo] = res其实是在字典里新增了一个字符串键的条目,而不是覆盖你初始化的整数键。这不会直接导致写入失败,但逻辑上可能不符合你的预期,建议把输入转成整数并做范围校验。
4. 写入逻辑不完整
你现在只把当前选中的res写入文件,但epcs字典里的其他值并没有被保存。如果你的目标是把所有EPC的状态都写入文件,需要遍历字典把所有键值对都写进去。
修正后的代码示例
import sqlite3 import os # 打印当前工作目录,方便找文件 print(f"当前工作目录:{os.getcwd()}") db = sqlite3.connect("air2.sql") cs = db.cursor() # 用字典推导式初始化,更简洁 epcs = {i: 0 for i in range(19)} def addepc(): # 先处理输入验证,避免无效输入 try: epcNo = int(input("EPC No:")) if epcNo not in epcs: print("EPC编号必须是0-18之间的数字哦!") return except ValueError: print("请输入有效的数字!") return # 查询完整数据 query1 = "SELECT * FROM epcval5 WHERE epc='EPC{}'".format(epcNo) cs.execute(query1) data = cs.fetchone() if not data: print(f"找不到EPC{epcNo}的数据!") return print("你选中的EPC信息:") for item in data: print(item) # 修正后的查询,转换value为浮点数 query2 = "SELECT CAST(value AS FLOAT) FROM epcval5 WHERE epc='EPC{}'".format(epcNo) cs.execute(query2) epcv = cs.fetchone() if not epcv: print(f"找不到EPC{epcNo}的数值!") return # 提取元组里的第一个元素并转成字符串 res = str(epcv[0]) print(f"转换后的数值类型:{type(res)}") # 更新字典 epcs[epcNo] = res # 把整个字典写入文件,覆盖原有内容(确保保存最新状态) with open('epcs.txt', 'w', encoding='utf-8') as f: for key, value in epcs.items(): f.write(f"EPC{key}: {value}\n") print("数据已经成功写入epcs.txt啦!") addepc() print("操作完成!按回车键继续...") input() # 关闭数据库连接,养成好习惯 db.close()
额外排查点(如果还是没看到文件)
- 文件路径问题:我在代码里加了打印当前工作目录的代码,你可以看看文件是不是保存在这个路径下。
- 权限问题:如果脚本运行的目录没有写入权限,可能会静默失败(不过通常Python会抛出错误),可以检查一下目录的读写权限。
内容的提问来源于stack exchange,提问作者unintention7
相关产品推荐
相关产品推荐

