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

如何遍历Polars LazyFrame列单元格并流式导出结果至CSV?

问题解决:遍历Polars Series并流式处理Parquet数据

遍历Series元素的修正

你当前代码中,df.select(["html"]).collect(streaming=True)返回的是DataFrame,而非Series。要遍历html列的每个单元格,需先提取对应Series,再迭代其元素:

import polars as pl

df = pl.scan_parquet('big_file.pq')
# 流式收集得到DataFrame
html_df = df.select(["html"]).collect(streaming=True)
# 提取html列的Series
html_series = html_df.get_column("html")

results = []
counter = 0
for html_content in html_series:
    counter += 1
    if counter == 3:
        break
    result = parser(html_content)
    results.append(result)

流式处理+分批写入CSV(满足低内存需求)

上述方式仍会将整列加载到内存,不符合你流式处理的核心需求。以下是更合理的实现:分批读取Parquet、处理后直接追加写入CSV,全程无需存储所有结果:

import polars as pl
from pathlib import Path

def parser(html_content: str) -> dict:
    # 替换为你的实际解析逻辑
    return {"parsed_sample": html_content[:10], "content_length": len(html_content)}

output_path = Path("parsed_output.csv")
first_write = True

# 流式分批读取并处理
for batch in pl.scan_parquet('big_file.pq').select(["html"]).iter_batches(streaming=True):
    html_batch = batch.get_column("html")
    # 处理当前批次的所有html内容
    parsed_batch = [parser(html) for html in html_batch]
    # 转换为DataFrame后追加写入CSV
    parsed_df = pl.DataFrame(parsed_batch)
    parsed_df.write_csv(
        output_path,
        mode="append",
        include_header=first_write
    )
    first_write = False

核心要点

  • Series迭代:Polars Series支持直接用for item in series遍历每个单元格的值,也可使用series.iter_rows()显式迭代,效果一致。
  • 流式分批:iter_batches(streaming=True)会逐批读取Parquet文件,每批数据量由Polars自动控制(可通过batch_size参数调整),避免内存过载。
  • CSV追加:通过mode="append"和include_header参数确保仅在第一次写入时输出表头,避免重复。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:12:05