pandas读取空格分隔txt文件报ParserError及空值问题求解
问题根因
- pandas读取抛出列数过多报错,核心原因是目标文件不同行的数值个数不统一。pandas默认基于C引擎解析时,会先扫描文件推断总列数,后续行的字段数和推断值偏差过大时就会直接触发解析错误,和分隔符参数的写法无关。
- 原生Python拆分出现空字符串,是因为你手动指定
split(" ")按单个空格做分隔符,一旦文件里存在连续多空格、行尾残留空格的情况,分隔位置就会被识别为空值。另外你之前用append存储拆分结果,最终得到的是按行分组的二维列表,不符合「所有数值拆为独立元素逐行存储」的需求。
正确实现方案
方案1:原生Python实现(无第三方依赖,最稳定)
直接用无参数的str.split()方法,它默认会将任意长度的连续空白(多个空格、制表符、换行符等)识别为分隔符,自动忽略行首行尾的空白字符,从根源上避免空字符串产生,同时用extend把所有值打平为一维列表:
data = [] # 用with上下文管理器自动处理文件关闭,避免资源泄漏 with open("train.txt", "r", encoding="utf-8") as f: for line in f: # 无参数split自动处理多空格、首尾空白,不会产生空串 line_nums = line.split() # 打平存储为独立元素,如果需要整数类型可以转成int data.extend([int(num) for num in line_nums]) # 逐行输出验证 for num in data: print(num)
方案2:pandas实现
如果需要用pandas处理,先按整行读入规避列数校验问题,再拆分打平即可,不会丢失数据:
import pandas as pd # 先按整行读取为单列,跳过列数校验逻辑 df = pd.read_csv("train.txt", header=None, sep="\n") # 按空白拆分所有行,打平为一维序列,自动去除空值 data = df[0].str.split(r"\s+", expand=True).stack().reset_index(drop=True) # 如需转整数类型,追加以下代码 # data = data.astype(int)
注意:不建议通过修改
on_bad_lines参数跳过异常行的方式读取,会直接丢失字段数不匹配行的内容,造成数据缺失。
内容的提问来源于stack exchange,提问作者Ririn
相关产品推荐
相关产品推荐

