如何使用Pandas快速加载存在格式错误的固定列宽空格分隔CSV文件
方案1:直接使用Pandas固定宽度文件读取接口(最优方案)
你提到文件所有列的起止位置为固定值,完全可以直接用Pandas内置的pd.read_fwf()接口加载,该接口专门用于读取固定列宽的文本文件,直接按位置切分列,完全不受分隔符缺失问题影响,底层为C实现,处理效率远高于自行逐行处理。
使用步骤:
- 先统计所有列的起止索引(遵循左闭右开规则),整理为
colspecs参数,示例如下:
import pandas as pd # 按实际列的起止位置调整每个元组的数值 colspecs = [ (0, 23), # 第一个时间戳列 (24, 47), # 第二个时间戳列 (48, 58), # 数值列1 (59, 69), # 数值列2 (70, 80), # 数值列3 (81, 93), # 数值列4 (94, 104), # 数值列5 (105, 117),# 数值列6 (118, 129),# 数值列7 (130, 140),# 数值列8 (141, 151) # 数值列9 ] df = pd.read_fwf( "你的文件路径.txt", colspecs=colspecs, decimal="," # 适配文件中逗号作为小数点的格式 )
- 不需要额外做格式修正,加载后直接获得正常的DataFrame。
方案2:全局正则预处理后加载
如果你不想统计列宽,也可以通过批量正则替换补全缺失的空格,再用pd.read_csv()加载,效率同样远高于逐行处理:
import re import pandas as pd # 一次性读取全量文件内容 with open("你的文件路径.txt", "r", encoding="utf-8") as f: content = f.read() # 给所有非行首、非空格前的负号前补空格 processed_content = re.sub(r"(?<!^|\s)(?=-)", " ", content) # 直接读取处理后的内容 df = pd.read_csv( pd.io.common.StringIO(processed_content), sep="\s+", decimal=",", header=None )
内容的提问来源于stack exchange,提问作者Ohibò
相关产品推荐
相关产品推荐

