You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas read_csv多分隔符失效:表头含#致列错位问题求助

问题:读取带注释和特殊表头的空格分隔CSV文件

问题场景

需要读取一个CSV文件为Pandas DataFrame,要求:

  • 跳过前19行注释内容
  • 表头位于第20行,但该行以#开头
  • 数据行以空格分隔

原始数据示例:

# comments...
...
# comments...
# Header1 Header2 Header3
Data1 Data2 Data3

使用以下代码时出现两个Unnamed列,无法得到表头与数据正确对应的结构:

df = pd.read_csv(df_path, skiprows=19, sep=r'#|\s+', engine='python', encoding='utf-8')

期望输出:表头为Header1、Header2、Header3,数据行与表头一一对应。

解决方案

方法1:先提取表头再读取数据

手动读取并处理表头行,再指定表头读取数据:

import pandas as pd

# 读取表头行并处理
with open(df_path, 'r', encoding='utf-8') as f:
    # 跳过前19行注释
    for _ in range(19):
        f.readline()
    # 读取第20行,去除开头的#和多余空格后分割为表头
    header = f.readline().strip().lstrip('#').split()

# 从第21行开始读取数据,用空格分隔,指定表头
df = pd.read_csv(
    df_path,
    skiprows=20,
    sep=r'\s+',
    engine='python',
    encoding='utf-8',
    names=header
)

方法2:读取后修正表头与数据

先按空格分隔读取所有内容,再修正表头并移除无效行:

import pandas as pd

# 跳过前19行,按空格分隔读取
df = pd.read_csv(
    df_path,
    skiprows=19,
    sep=r'\s+',
    engine='python',
    encoding='utf-8'
)

# 将第一行(原表头行)转为表头,去掉开头的#
df.columns = df.iloc[0].tolist()[1:]

# 删除原表头行,重置索引
df = df[1:].reset_index(drop=True)

方法3:调整分隔符正则并删除空列

优化分隔符正则,匹配#加任意空格,再删除多余的空列:

import pandas as pd

df = pd.read_csv(
    df_path,
    skiprows=19,
    sep=r'#\s*|\s+',  # 匹配#开头加任意空格,或多个空格
    engine='python',
    encoding='utf-8'
)

# 删除开头的空列(由#分割产生)
df = df.drop(df.columns[0], axis=1)

内容的提问来源于stack exchange,提问作者monicaJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 21:37:27