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

如何确定polars读取CSV的skip_rows与n_rows:从foo行到首个空行

一次扫描文件获取Polars读取指定区间数据的参数

需要从文本文件中读取一段数据到Polars DataFrame,数据起始于包含字符串foo的行,终止于该行之后的首个空行。已知Polars的pl.read_csv()支持skip_rows和n_rows参数,但需要在不重复扫描文件的前提下获取这两个参数,同时处理以下边缘情况:

  • 文件中不存在含foo的行
  • 数据持续到文件末尾无空行

完整实现代码

from pathlib import Path
import polars as pl

file_path = Path('test.txt')

skip_rows = 0
n_rows = 0
found_foo = False

with open(file_path, 'r') as file:
    for line_number, line in enumerate(file, 1):
        if not found_foo:
            if 'foo' in line:
                skip_rows = line_number - 1
                found_foo = True
                n_rows = 1  # 表头行计入读取行数
        else:
            stripped_line = line.strip()
            if not stripped_line:
                break  # 遇到首个空行,停止计数
            n_rows += 1

# 处理未找到目标行的异常
if not found_foo:
    raise ValueError("文件中未找到包含'foo'的行")

# 读取数据到DataFrame
df = pl.read_csv(
    file_path,
    skip_rows=skip_rows,
    n_rows=n_rows,
    separator='\s+'  # 适配示例中的多空格分隔符
)

print(df)

关键逻辑说明

  • 一次扫描效率:通过单次遍历完成skip_rows定位和n_rows统计,避免重复IO操作。
  • 状态标记:用found_foo变量标记是否进入目标数据区间,找到foo行后立即开始计数。
  • 空行判断:通过line.strip()判断空行,确保只含空白字符的行也会被识别为终止行。
  • 边缘情况处理:
    • 未找到foo行:遍历结束后主动抛出ValueError,明确告知错误原因。
    • 数据到文件末尾:循环会持续计数直到文件结束,n_rows自动包含从foo行到最后一行的所有非空行。
  • 分隔符适配:示例数据使用多空格分隔,因此设置separator='\s+',实际使用时可根据文件格式调整。

示例输出

针对题目中的test.txt,运行代码后输出的DataFrame为:

shape: (3, 3)
┌─────┬─────┬────────┐
│ foo ┆ bar ┆ foobar │
│ --- ┆ --- ┆ ---    │
│ i64 ┆ i64 ┆ str    │
├─────┼─────┼────────┤
│ 1   ┆ 2   ┆ A      │
│ 4   ┆ 5   ┆ B      │
│ 7   ┆ 8   ┆ C      │
└─────┴─────┴────────┘

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:02:39