You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动