Polars中read_csv_batched遇字段含分隔符时的批次读取异常问题
Polars read_csv_batched 批次异常问题分析
问题描述
我尝试读取一个超3000万行、无法全量载入内存的大型CSV文件,因此使用Polars的read_csv_batched方法。但发现调用reader.next_batches(5)时,未返回指定数量的批次DataFrame,而是始终返回包含所有行的1个DataFrame(超出设定批次大小)。
最小复现示例
测试文件内容
# error.csv a,b "test","test" "test","test" "test",",," # 注意此处包含两个逗号
# correct.csv a,b "test","test" "test","test" "test"," ," # 此处仅包含一个逗号,且前面有空格
测试代码
reader_error = pl.read_csv_batched("./assets/error.csv", separator=",", batch_size=1, quote_char="\"") batch = reader_error.next_batches(2) print(len(batch)) # 输出1,不符合预期 reader_correct = pl.read_csv_batched("./assets/correct.csv", separator=",", batch_size=1, quote_char="\"") batch = reader_correct.next_batches(2) print(len(batch)) # 输出2,符合预期
环境信息
Python: 3.10 Polars: 0.20.31
问题原因
这是Polars 0.20.31版本存在的解析bug:当CSV字段包含被引号包裹的连续分隔符(比如",,")时,批处理读取的行边界检测逻辑会出现异常,无法按设定的batch_size拆分批次,只能将整个文件内容合并为一个批次返回。而当引号内的内容包含非分隔符(比如空格)时,解析逻辑能正常识别行边界,按预期拆分批次。
你的CSV文件创建没有疏漏,引号内的内容符合CSV规范,问题出在旧版本Polars的解析逻辑上。
解决方法
- 优先升级Polars版本:这个bug在Polars后续的稳定版本中已经被修复,升级到最新版本即可解决该问题。
- 若暂时无法升级,可尝试调整
infer_schema_length参数为0(关闭schema推断的行数限制),但该方法并非完全可靠,最稳妥的方案仍是升级版本。
内容的提问来源于stack exchange,提问作者Mike Xydas
相关产品推荐
相关产品推荐

