Python Polars扫描CSV与读取CSV有什么区别
在 Polars 里,read_csv 和 scan_csv 都能处理 CSV,但它们把“读取”和“执行”放在了不同位置:read_csv 直接返回已经读取的 DataFrame;scan_csv 返回描述查询的 LazyFrame,真正读取通常等到 collect()。如果后面还要继续筛选列、过滤行或聚合,优先考虑扫描;如果正在探索数据、需要马上查看中间结果,直接读取更顺手。
官方地址:https://docs.pola.rs/user-guide/io/csv/
可以把两者理解成两种调用方契约:read_csv承诺“现在给我一张表”,scan_csv承诺“先把查询描述好,最后统一执行”。差别不在 CSV 格式,而在 LazyFrame 是否保留了优化查询的机会。
先区分返回对象和执行时机
我第一次把 Polars 用在批量 CSV 清洗时,最容易混淆的是两个函数都看起来像“打开文件”。实际上,read_csv 的返回值是 DataFrame,调用点就会开始解析文件;scan_csv 的返回值是 LazyFrame,它先保存数据源和后续表达式。
import polars as pl
# 直接读取:调用结束时已经得到内存中的 DataFrame。
eager_df = pl.read_csv("sales.csv")
print(eager_df.head())
# 延迟扫描:这里只建立查询描述,不把结果收集成 DataFrame。
lazy_query = pl.scan_csv("sales.csv")
# collect 才是执行边界,返回最终的 DataFrame。
result_df = lazy_query.select(["region", "amount"]).collect()
print(result_df.head())
因此,scan_csv 并不是“把整个 CSV 读进来后换一种对象包装”。它延后了解析和查询执行,让后续的 select、filter、group_by 可以一起交给查询计划。

scan_csv 的价值在于把查询一起交给优化器
官方文档把扫描 CSV 描述为延迟解析,并指出查询优化器可以把谓词和投影下推到扫描层。简单说,过滤条件可能尽量提前应用,列选择也可以让扫描只关注需要的列,从而减少不必要的读取、内存和计算。
import polars as pl
# 先描述完整查询:只保留后续真正需要的列和行。
query = (
pl.scan_csv("sales.csv")
.select(["region", "amount"])
.filter(pl.col("amount") > 1000)
.group_by("region")
.agg(pl.col("amount").sum().alias("total_amount"))
)
# 统一执行查询;此前的链式调用仍然只是 LazyFrame 描述。
summary = query.collect()
print(summary)
这里的收益有一个边界:只有仍处于 LazyFrame 查询中的操作,优化器才有机会统一安排。若中途已经 collect(),后续操作就是针对 DataFrame 的新一轮处理,前面的扫描范围不会再被后面的条件缩小。

按调用方需求选择 read_csv 还是 scan_csv
如果任务是临时查看文件、交互式探索,或者你必须在每一步观察中间表,read_csv 的直接反馈更符合调用方预期。它少一个执行边界,代码也更短。
如果任务是固定的数据管道,例如读取后只留几列、过滤一部分行再聚合,scan_csv 更适合。它的核心不是保证任何数据集都更快,而是保留优化器重新安排查询的空间。
| 需求 | 建议 | 原因 |
|---|---|---|
| 马上查看列名和样例 | read_csv | 调用后直接得到 DataFrame |
| 多步过滤、选列、聚合 | scan_csv | 可以统一形成 LazyFrame 查询 |
| 需要中间结果参与分支判断 | read_csv 或提前 collect | 调用方确实需要立即拿到数据 |
| 想确认优化是否生效 | scan_csv(...).filter(...).explain() | 直接查看查询计划文本 |
用 explain 复查计划,而不是凭感觉猜性能
扫描模式的性能优势不能只靠函数名判断。把查询交给 explain(),可以查看计划中是否出现需要的列数、过滤条件和 CSV scan 节点:
import polars as pl
# explain 只展示计划,适合检查优化器看到的查询形状。
query = (
pl.scan_csv("sales.csv")
.filter(pl.col("amount") > 1000)
.select(["region", "amount"])
)
print(query.explain())
# 真正需要结果时再执行,并把执行边界集中在这里。
result = query.collect()
常见误区有三个:把 scan_csv 当成自动分块读取;在很早的位置调用 collect(),让后面的过滤失去下推机会;为了“更快”而忽略必须立即查看中间结果的业务需求。正确选择应由查询形状和调用方时机共同决定。
相关问题
scan_csv 调用后是不是已经把文件读进内存了?
不应这样理解。它先返回 LazyFrame 并延后实际解析,通常在 collect() 等执行动作发生时才运行查询。
所有 CSV 都应该改成 scan_csv 吗?
不是。探索数据、需要中间结果或查询很简单时,read_csv 更直接;固定的多步查询才更适合先扫描再统一收集。
怎样知道过滤和选列是否被下推?
对 LazyFrame 调用 explain() 查看查询计划,关注扫描节点、投影列数和过滤条件,而不是只比较函数名称。
Python Polars LazyFrame怎样查看查询计划
- 上一篇
- Python Polars LazyFrame怎样查看查询计划
- 下一篇
- Python Textual后台任务怎么把结果送回界面
-
- 文章 · python教程 | 52分钟前 |
- Python Jinja按模板后缀开启自动转义怎么配置
- 320浏览 收藏
-
- 文章 · python教程 | 53分钟前 | Python 模板变量 Jinja StrictUndefined UndefinedError
- Python Jinja StrictUndefined怎样暴露缺失模板变量
- 477浏览 收藏
-
- 文章 · python教程 | 55分钟前 | CLI · 命令行 · python · 命令行选项 list[str] Python Typer Typer重复参数 Typer列表参数 list[float]
- Python Typer可重复参数怎样收集为列表
- 157浏览 收藏
-
- 文章 · python教程 | 59分钟前 | Python 后台任务 Worker Textual post_message
- Python Textual后台任务怎么把结果送回界面
- 317浏览 收藏
-
- 文章 · python教程 | 1小时前 | 查询优化 · Python explain 查询计划 Polars LazyFrame show_graph
- Python Polars LazyFrame怎样查看查询计划
- 421浏览 收藏
-
- 文章 · python教程 | 1小时前 | 数据校验 · python · Python Pydantic field_validator model_validator 联合约束
- Python Pydantic怎样对多个字段实施联合约束
- 210浏览 收藏
-
- 文章 · python教程 | 1小时前 | Python Pydantic After field_validator before
- Python Pydantic字段校验器before与after怎么选择
- 469浏览 收藏
-
- 文章 · python教程 | 8小时前 |
- Python singledispatchmethod 在继承类中为什么没有命中重载
- 362浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 463次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 526次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 543次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 491次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 311次使用
-
- golang如何操作csv文件详解
- 2023-01-19 361浏览
-
- go格式“占位符”输入输出 类似python的input
- 2023-01-19 346浏览
-
- Golang如何调用Python代码详解
- 2023-01-07 235浏览
-
- Go 大文件 CSV 导出怎么做稳:从全量查询到流式写出架构
- 2026-07-08 251浏览
-
- Go 批量 CSV 导入怎么控内存:流式读取、资源预算和失败行回传实战
- 2026-07-20 407浏览

