在日常办公和数据分析中,你是否遇到过以下场景:
- 打开一个几百兆的 csv 文件,excel 直接卡死或转圈半小时?
- 想要对多个表格进行合并统计,vlookup 公式写到手软?
- 觉得安装 mysql、postgresql 等大型数据库太麻烦,只想在本地快速处理数据?
如果你的答案是肯定的,那么 duckdb 就是为你量身定制的工具。它被誉为“数据分析界的 sqlite”,以安装极其简单、运行速度飞快、直接查询文件而著称。
本文将带你从零开始,掌握这个 python 办公自动化领域的“新晋顶流”。
1. 什么是 duckdb?为什么选择它?
对于初学者,你可以这样理解 duckdb:
- 它是“分析型”的 sqlite:它是一个数据库,但不需要你配置服务器、账号密码。它只是一个文件,或者直接运行在你的内存里。
- 它是 excel 的超强替补:excel 处理几十万行数据就开始吃力,而 duckdb 可以轻松在普通的笔记本电脑上秒级处理亿级数据。
- 它是 sql 的练习场:它支持标准的 sql 语法,非常适合学习数据库查询。
核心优势:
- 无服务器(serverless):
pip install即可使用,无需后台服务。 - 列式存储(columnar):专门为分析统计设计,做聚合运算(求和、平均值)比传统数据库快几十倍。
- 零门槛交互:可以直接用 sql 语句查询 csv、excel、parquet 文件,甚至可以直接查询 python 的变量。
2. 环境准备 (prerequisites)
开始之前,请确保你的电脑上已经安装了 python。
安装 duckdb
打开你的终端(terminal 或 cmd),输入以下命令:
pip install duckdb pandas
注:我们同时安装了 pandas,因为 duckdb 和 pandas 配合使用简直是天作之合。
3. duckdb 实战指南 (step-by-step guide)
我们将通过四个循序渐进的场景,带你掌握 duckdb 的核心用法。
场景一:hello world —— 第一次运行 sql
duckdb 最酷的地方在于,你不需要先“建库”或“建表”,可以直接对数据进行操作。
新建一个 python 文件 demo_basic.py:
import duckdb
# 1. 这是一个内存数据库,程序结束数据就会消失
# 我们可以直接运行 sql 语句
result = duckdb.sql("select 'hello duckdb' as message, 42 as number")
# 2. 展示结果
result.show()
运行结果:你会看到一个漂亮的表格打印在终端里。不需要 connect,不需要 cursor,一行代码即可运行。
场景二:直接查询 csv 文件 —— 告别 excel 卡顿
假设你有一个销售数据文件 sales.csv。在传统数据库中,你需要先创建表结构,然后导入数据。在 duckdb 中,你可以直接把文件当成表来查!
首先,我们用 python 生成一个模拟的 csv 文件:
import pandas as pd
import numpy as np
# 生成 10万行 模拟数据
df = pd.dataframe({
'product': np.random.choice(['apple', 'banana', 'orange'], 100000),
'price': np.random.randint(1, 10, 100000),
'quantity': np.random.randint(1, 5, 100000)
})
df.to_csv('sales.csv', index=false)
print("csv 文件已生成!")
接下来,使用 duckdb 直接分析这个 csv:
import duckdb
# 需求:统计每种水果的总销售额(价格 * 数量),并按销售额降序排列
# 注意:我们直接在 from 后面写文件名!
query = """
select
product,
sum(price * quantity) as total_revenue
from 'sales.csv'
group by product
order by total_revenue desc
"""
duckdb.sql(query).show()
原理解析:duckdb 能够智能识别 csv 的表头和数据类型,你不需要定义 schema,它会自动推断。对于几百兆甚至几个 g 的文件,这种方式比 excel 快无数倍。
场景三:duckdb 与 pandas 的无缝衔接
这是 python 办公自动化中最强大的功能。如果你已经有一个 pandas 的 dataframe 变量,你可以直接用 sql 查询它,而不需要把数据存入数据库。
import duckdb
import pandas as pd
# 假设这是你从 excel 读取的数据
df_employee = pd.dataframe({
'name': ['alice', 'bob', 'charlie', 'david'],
'dept': ['hr', 'it', 'it', 'hr'],
'salary': [5000, 8000, 8500, 5200]
})
# 需求:找出 it 部门薪资大于 8000 的人
# 这里的 'df_employee' 是 python 变量名,duckdb 能直接识别!
result = duckdb.sql("""
select name, salary
from df_employee
where dept = 'it' and salary > 8000
""")
# 将结果转换回 pandas dataframe 以便后续处理
df_result = result.df()
print(df_result)
为什么这很重要?
很多初学者觉得 pandas 的筛选语法(如 df[(df['dept']=='it') & ...])很难记。使用 duckdb,你可以直接用你熟悉的 sql 语句来操作 pandas 数据。
场景四:数据持久化 —— 保存你的分析结果
默认情况下,duckdb 是运行在内存里的(in-memory)。如果你想把处理好的数据保存下来,像 sqlite 一样存成一个数据库文件,也非常简单。
import duckdb
# 1. 连接到一个具体的数据库文件(如果不存在会自动创建)
con = duckdb.connect('my_office_data.db')
# 2. 创建一个表并插入数据
con.sql("create table if not exists users (id integer, name varchar)")
con.sql("insert into users values (1, 'zhang san'), (2, 'li si')")
# 3. 查询数据
con.sql("select * from users").show()
# 4. 关闭连接
con.close()
下次你需要使用数据时,再次 connect('my_office_data.db') 即可。
4. 进阶技巧:通配符查询 (globbing)
在办公场景中,我们经常遇到文件夹里有 2023-01.csv, 2023-02.csv … 2023-12.csv 等一堆格式相同的文件。
使用 pandas,你需要写循环读取再 concat。
使用 duckdb,只需要一行代码:
# 这里的 list_data/*.csv 是通配符,表示读取该目录下所有 csv
# duckdb 会自动把它们合并成一张大表进行查询
duckdb.sql("select * from 'list_data/*.csv' limit 5").show()
5. 常见误区与注意事项 (common pitfalls)
虽然 duckdb 很强大,但新手在使用时需要注意以下几点:
单进程锁定:duckdb 是一个嵌入式数据库(类似 sqlite)。如果你用 python 代码连接了 my_data.db 且没有关闭连接(.close()),你就不能同时用另一个 python 脚本或 dbeaver 等工具去连接同一个文件。它不支持多用户同时写入。
解决:确保在代码最后关闭连接,或使用 with duckdb.connect(...) 上下文管理器。
sql 语法差异:duckdb 使用的是 postgresql 风格的 sql 语法。虽然它兼容大部分标准 sql,但如果你习惯了 mysql 的某些特有函数,可能需要查阅文档寻找对应写法。
内存管理:虽然 duckdb 支持“超大内存数据处理”(out-of-core processing),即数据量超过内存大小时将数据溢出到硬盘,但在处理极大规模数据(如数百 gb)时,仍需注意配置 temp_directory 以免占满 c 盘空间。
6. 总结与资源
duckdb 是 python 办公自动化领域的一匹黑马。它填补了 pandas(内存受限)和 传统数据库(部署麻烦)之间的空白。
回顾一下它的核心用法:
duckdb.sql("select ..."):快速运行 sql。from 'data.csv':直接查询文件。from df_variable:直接查询 pandas 变量。
到此这篇关于python数据分析神器duckdb保姆级使用入门指南的文章就介绍到这了,更多相关python duckdb数据分析内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论