如何让Pandas读取含连续末尾分隔符的CSV时保留完整列数并将末尾列设为null
如何让Pandas读取含连续末尾分隔符的CSV时保留完整列数并将末尾列设为null
这个问题我之前也踩过坑!pandas默认用的C语言解析器会自动忽略行末尾的连续分隔符,只创建到最后一个有非空值的列,所以才会出现你看到的列数缺失情况。给你两个实用的解决方法:
方法一:切换到Python解析器(简单省心)
直接在read_csv里加上engine='python'参数,Python引擎会严格按照每行的分隔符数量来生成列,不会忽略末尾的空分隔符,同时默认会把空列设为NaN(也就是pandas里的null值)。修改你的代码如下:
df = pd.read_csv( config.get("OS", "output_file"), header=None, delimiter=config.get("OS", "delimiter"), decimal=".", engine='python', # 关键:用Python引擎解析 keep_default_na=True # 确保空列被设为NaN(可选,默认就是True) ) # 如果你需要把NaN换成空字符串就保留这行,要保留null就删掉 df = df.fillna(value='')
这样处理后,所有末尾的分隔符对应的列都会被保留,空值会设为NaN。唯一的小缺点是Python引擎的解析速度比C引擎慢一点,但日常数据量下基本感觉不出来。
方法二:手动指定列数(适合大数据量)
如果你提前知道CSV文件的总列数(数一下一行里的分隔符数量加1就是总列数),可以手动用names参数指定列名列表,这样即使是C引擎也会严格生成对应数量的列,末尾空列自动设为NaN。
比如假设你的CSV每行总共有40列,就先生成40个列名,再传给read_csv:
# 生成对应数量的列名,这里假设是40列 col_names = [f'col_{i}' for i in range(40)] df = pd.read_csv( config.get("OS", "output_file"), header=None, names=col_names, delimiter=config.get("OS", "delimiter"), decimal=".", keep_default_na=True )
这种方法能继续使用高效的C引擎,适合处理超大CSV文件时用。
验证效果
运行修改后的代码后,你可以用print(df.shape)查看列数,应该和你CSV里的实际列数一致,末尾的空列也会显示为NaN(null),完美解决问题!
备注:内容来源于stack exchange,提问作者Shmyg
相关产品推荐
相关产品推荐

