使用Polars的write_csv时触发InvalidOperationError“file encoding is not UTF-8”的原因及追加CSV文件的推荐方案咨询
使用Polars的write_csv时触发InvalidOperationError“file encoding is not UTF-8”的原因及追加CSV文件的推荐方案咨询
嗨,我来帮你拆解这个问题~
首先说说你遇到的InvalidOperationError: file encoding is not UTF-8错误:
在Windows 10系统中,用open()函数打开文件时如果不指定编码,默认会使用系统本地编码(通常是GBK这类非UTF-8格式),而Polars的write_csv()方法默认要求写入的文件采用UTF-8编码,两者不匹配就触发了这个错误。
解决这个问题非常简单,只需要在打开文件时明确指定encoding="utf-8"参数就行,修改后的代码如下:
import polars as pl df1 = pl.DataFrame({"a": [1, 2], "b": [3 ,4]}) df2 = pl.DataFrame({"a": [5, 6], "b": [7 ,8]}) with open("out.csv", mode="a", encoding="utf-8") as f: df1.write_csv(f) df2.write_csv(f, include_header=False)
接下来聊聊你关心的“这个玩具示例是不是追加CSV的推荐方案”:
这个逐次写入的方法是可行的,但要根据你的实际场景灵活选择:
- 如果数据量不大,更简洁的方式是先把多个DataFrame合并成一个,再一次性写入CSV,这样能避免手动处理表头的麻烦:
combined_df = pl.concat([df1, df2]) combined_df.write_csv("out.csv") - 但如果数据量很大,合并后会造成内存压力,那逐次追加的方法就更合适,不过要注意几个细节:
- 首次写入时要确保写入表头,后续追加必须加上
include_header=False,避免重复表头 - 始终指定UTF-8编码,避免跨系统的编码兼容问题
- 如果需要适配不同系统的换行符,可以在
write_csv()中指定new_line="\r\n"(Windows)或"\n"(Unix)
- 首次写入时要确保写入表头,后续追加必须加上
目前Polars还没有专门的append_csv()方法,所以上述两种方式都是当前的主流方案,你可以根据数据规模和需求来选。
备注:内容来源于stack exchange,提问作者SapereAude
相关产品推荐
相关产品推荐

