You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Polars的scan_csv从内存读取CSV字符串实现惰性求值?

在Polars中用scan_csv读取内存中的CSV字符串(惰性求值)

Polars的scan_csv()默认支持从文件路径读取,但要处理内存中的CSV字符串并保留惰性求值的优势,只需要把字符串转换为**二进制流对象(BytesIO)**传入即可,具体步骤如下:

实现步骤

  • 将CSV字符串编码为字节数据,存入io.BytesIO对象(Polars的scan_csv更适配二进制流)
  • 直接用pl.scan_csv()读取这个BytesIO对象,返回的是LazyFrame,天然支持惰性求值

示例代码

import polars as pl
from io import BytesIO

# 示例CSV字符串
csv_str = """name,age,city
Alice,30,New York
Bob,25,London
Charlie,35,Paris"""

# 将字符串转为BytesIO流
csv_bytes = BytesIO(csv_str.encode("utf-8"))

# 使用scan_csv实现惰性读取
lazy_df = pl.scan_csv(csv_bytes)

# 验证惰性特性:此时数据未实际加载,只有执行collect()才会计算
print(lazy_df)
# 执行实际计算并获取结果
result = lazy_df.collect()
print(result)

关键说明

  1. 为什么用BytesIO而非StringIO?
    Polars的底层基于Rust实现,scan_csv对二进制流的支持更直接高效,StringIO是文本模式流,无法直接被scan_csv识别。

  2. scan_csv vs read_csv+lazy()的区别

    • pl.scan_csv()直接生成LazyFrame,从一开始就采用惰性策略,不会立即加载数据到内存,适合处理大体积的CSV字符串或文件。
    • pl.read_csv().lazy()是先将数据全量加载为DataFrame,再转换为LazyFrame,会额外占用内存,失去了惰性求值的核心优势。

内容的提问来源于stack exchange,提问作者arnabanimesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 23:22:02