直接用csv.writer写入csv文件,先取cursor.description[0]获取字段名写入header,再用fetchall()获取数据写入,文件需以encoding='utf-8-sig'和newline=''打开防乱码与空行。

sqlite3查询结果怎么直接写入CSV文件
不用中间转成列表或字典,sqlite3.Cursor 的 fetchall() 和 description 就够用了。关键是别漏掉字段名——很多人导出后发现第一行是空的,就是因为没手动写 header。
- 先用
cursor.execute()执行查询,确保 SQL 语法正确(比如别漏SELECT) - 用
cursor.description获取列名元组,每个元素是(name, ...)形式,取[0]即可 -
cursor.fetchall()拿数据,它返回的是元组列表,csv.writer原生支持 - 打开文件必须用
mode='w', newline='',否则 Windows 下会多空行
为什么用 csv.writer 而不是 pandas.to_csv
如果只是导出、不加工,pandas 是杀鸡用牛刀:要额外安装、启动慢、内存占用高,尤其查几万行时明显卡顿。而 csv.writer 零依赖、流式写入、内存只存当前行。
-
pandas.read_sql会把整张表读进 DataFrame 再转 CSV,多一次拷贝 -
csv.writer可配合itertools.islice实现分批导出,适合大结果集 - SQLite 默认不支持
OUTFILE类语法,没法绕过 Python 层
导出时中文乱码或报错 UnicodeEncodeError 怎么办
根本原因是系统默认编码(如 Windows 的 cp1252)和 CSV 期望的 UTF-8 不匹配。Python 3 默认字符串是 Unicode,但文件写入时需显式指定 encoding。
从 CSV 数据集生成图数据库加载器和三元组映射。将表格 CSV 数据转换为图数据库可直接使用的节点、边和三元组。
- 写文件时必须加
encoding='utf-8-sig'(-sig是为了 Excel 能正确识别 UTF-8 BOM) - 不要用
encoding='gbk'—— 虽然 Excel 打得开,但跨平台会崩,且 SQLite 内部存的就是 UTF-8 - 如果数据里有控制字符(如 \x00),
csv.writer会抛UnicodeEncodeError,需提前过滤:row = [str(x).replace('\x00', '') for x in row]
完整可运行示例(含异常防护)
import sqlite3
import csv
<p>def export_query_to_csv(db_path, query, output_path):
try:
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
cursor.execute(query)</p><pre class="brush:python;toolbar:false;"> # 获取列名
headers = [desc[0] for desc in cursor.description]
rows = cursor.fetchall()
with open(output_path, 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.writer(f)
writer.writerow(headers)
writer.writerows(rows)
except sqlite3.Error as e:
print(f"SQL error: {e}")
except OSError as e:
print(f"File error: {e}")
finally:
if 'conn' in locals():
conn.close()用法
export_query_to_csv('app.db', 'SELECT * FROM users WHERE active = 1', 'users_active.csv')
注意 cursor.description 在没执行查询或查询无结果时为 None,所以别在 execute 前就取它;另外,如果查询带参数(如 WHERE id = ?),务必用参数化方式传值,别拼字符串。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










