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

