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
相关产品推荐
相关产品推荐

