ARTICLE · 1043845
【开源软件】DuckDB:直接查询CSV
手里只有一张 CSV,想知道每个城市有几条记录,不一定要先装数据库服务器、建表再导入。DuckDB 是遵循 MIT 协议的进程内分析数据库,可以把本地文件直接当成查询对象。本文用一个可以逐项核对的小表说明它省掉了哪一步,也提醒哪些自动判断仍需要人检查。
“直接查”究竟省掉了什么
传统流程常把 CSV 先导入一张持久表,再运行 SQL。DuckDB 的 read_csv 可以在查询时读取文件,自动探测分隔符、表头与列类型,因此适合先确认行数、分组和异常值,再决定是否把结果保存为数据库或 Parquet。
它不是“数据完全不用处理”:如果金额列混进文字、日期格式不统一,自动推断可能与预期不同;文件更新后再次查询也会读到新内容。对长期复现的分析,应记录文件版本,并显式检查字段类型、缺失值和输入路径,而不是只保存一段 SQL。

用三行数据验证
准备 Python 3,在一个空目录安装官方 Python 包:
python -m pip install duckdb以下程序先生成 sales.csv,再直接读取它做分组。它只写当前目录的示例文件,不连接数据库服务,也不会读取电脑上的其他资料。
from pathlib import Path import duckdb Path("sales.csv").write_text( "city,amount\n北京,10\n上海,20\n北京,5\n", encoding="utf-8") sql = """SELECT city, COUNT(*) AS orders, SUM(amount) AS total FROM read_csv('sales.csv') GROUP BY city ORDER BY city""" print(duckdb.sql(sql).fetchall())预期结果是北京 2 条、合计 15;上海 1 条、合计 20。若结果不同,先打开 CSV 核对是否多了一行或金额被识别为文字。把示例换成自己的文件前,先用 DESCRIBE SELECT * FROM read_csv('文件名.csv') 查看推断出的列类型;涉及隐私的表,不应把原文件上传到公共演示站求助。
哪些时候值得把查询固定下来
一次性的筛选、求和、去重或探索性分析,直接读 CSV 很顺手;需要多次复用、跟踪数据版本或分享给团队时,再考虑落成持久表、Parquet 或受控的数据管道。CSV 的列名、编码、分隔符和日期格式都可能变化,自动探测能缩短起步时间,不能替代输入校验。
如果原文件很大,仍要考虑磁盘空间、临时文件和内存限制。
适用边界
DuckDB 适合分析人员、开发者和有 SQL 基础的读者快速检查本地结构化文件。
官方入口
GitHub:https://github.com/duckdb/duckdb 官方网站:https://duckdb.org/ CSV 文档:https://duckdb.org/docs/current/data/csv/overview Python 安装:https://duckdb.org/docs/current/clients/python/installation