Python脚本读取SQLite数据写入文本文件时仅重复写入最后一行的问题
解决SQLite数据写入文本重复最后一行/仅保留最后一行的问题
嘿,我之前也踩过类似的坑,咱们一步步揪出问题根源!
你说控制台能正常显示所有数据,但文件里要么只留最后一行,要么重复写入最后一行,这说明数据查询和遍历的逻辑是没问题的,问题肯定出在文件操作的细节处理上。常见的几个坑给你列出来:
1. 文件打开时机不对,未正确管理句柄
如果你的代码是在循环里每次都用open("file.txt", "a+")打开文件,但没有及时关闭,操作系统的缓冲区会把多次写入操作缓存起来,最后程序结束时可能只处理最后一次的写入请求,导致只有最后一行被保存到磁盘。
比如这种错误写法:
for row in cursor.fetchall(): print(row) # 控制台正常输出 f = open("output.txt", "a+") f.write(str(row)) # 这里没写f.close(),坑就在这!
2. 误用文件打开模式
虽然你说用了a+,但万一不小心笔误写成w+或者w,那每次打开文件都会清空原有内容,最后自然只剩最后一行数据。这个细节一定要仔细检查!
3. 未刷新缓冲区,数据滞留在内存里
Python的文件对象默认是带缓冲的,如果你在循环内写入后没有手动刷新,或者没关闭文件,缓冲区里的内容不会立刻写入磁盘,最后可能因为程序退出时的清理机制,只把最后一部分数据写进去。
靠谱的解决方案
直接用with语句管理文件,它会自动帮你处理打开、关闭和缓冲区刷新的问题,绝对省心:
import sqlite3 def export_data(): # 连接数据库 conn = sqlite3.connect("your_database.db") cursor = conn.cursor() # 查询所有数据 cursor.execute("SELECT * FROM your_table") all_rows = cursor.fetchall() # 控制台验证数据(没问题可跳过) for row in all_rows: print(row) # 正确写入文件:循环外打开文件,批量写入 with open("output.txt", "a+", encoding="utf-8") as f: for row in all_rows: # 记得加换行符,避免所有内容挤在一行 f.write(f"{str(row)}\n") # 关闭数据库连接 conn.close() if __name__ == "__main__": export_data()
额外提醒
- 把文件打开放在循环外面,既减少频繁IO操作的开销,也能保证所有写入都被正确处理。
- 一定要加
encoding="utf-8",避免出现乱码问题。 - 如果确实需要在循环内打开文件(比如特殊场景),记得每次打开后都调用
f.close(),或者用with包裹每次写入操作。
内容的提问来源于stack exchange,提问作者GreenCoder90




