如何遍历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
相关产品推荐
相关产品推荐

