使用Pandas读取带/分隔符的TXT文件遇解析错误的技术咨询
解决CSV解析错误并实现指定行作为表头的方案
错误原因
你遇到的ParserError是因为文件中不同行的字段数量不一致:
- 比如
DATE开头的行按/分割后是4个字段,而DATA开头的行分割后是5个字段 pd.read_csv默认会根据第一行的字段数解析所有行,当后续行字段数不匹配时就会抛出错误- 直接用
sep='/''不会处理/前后的空格,会导致字段分割后带有多余空格,进一步加剧解析问题
解决方案
以下两种方法都能解决问题,同时实现将DATA行作为其下方数据行的表头,并保留每个数据块的元数据(日期、时间、K1等):
方法一:手动逐行处理(更灵活)
import pandas as pd # 读取文件并预处理每行 lines = [] with open(r'<path>', 'r') as f: for line in f: stripped_line = line.strip() # 跳过空行和分隔线 if not stripped_line or stripped_line.startswith('---'): continue # 按/分割并去掉每个字段的前后空格 parts = [p.strip() for p in stripped_line.split('/')] lines.append(parts) # 整理结构化数据 data_rows = [] current_meta = {} # 存储当前数据块的元数据(日期、时间等) header = None for parts in lines: if parts[0] == 'DATE': # 提取日期和时间 current_meta['DATE'] = parts[1] current_meta['TIME'] = parts[3] elif parts[0] == 'K1': # 提取K1和Picker信息 current_meta['K1'] = parts[1] current_meta['PICKER'] = parts[2] elif parts[0] == 'DATA': # 设置当前数据块的表头 header = parts else: # 将数据行与表头匹配,合并元数据 if header: row_dict = dict(zip(header, parts)) row_dict.update(current_meta) data_rows.append(row_dict) # 转换为DataFrame df = pd.DataFrame(data_rows)
方法二:利用pandas读取后再处理
import pandas as pd # 用正则分隔符读取所有行,忽略/前后的空格 df_raw = pd.read_csv( r'<path>', sep=r'\s*/\s*', header=None, engine='python', # 必须用python引擎支持正则分隔符 skip_blank_lines=True ) # 过滤掉分隔线行 df_raw = df_raw[~df_raw[0].str.startswith('---', na=False)] # 整理数据 data_rows = [] current_meta = {} header = None for idx, row in df_raw.iterrows(): # 去掉空值,得到有效字段列表 parts = row.dropna().tolist() if parts[0] == 'DATE': current_meta['DATE'] = parts[1] current_meta['TIME'] = parts[3] elif parts[0] == 'K1': current_meta['K1'] = parts[1] current_meta['PICKER'] = parts[2] elif parts[0] == 'DATA': header = parts else: if header: row_dict = dict(zip(header, parts)) row_dict.update(current_meta) data_rows.append(row_dict) df = pd.DataFrame(data_rows)
最终效果
处理后的df会将每个数据行与对应的DATA表头匹配,同时包含每个数据块的日期、时间、K1等元数据,示例输出大致如下:
| DATA | NOMINAL | ACTUAL | TOLERANCE | DEVIATION | DATE | TIME | K1 | PICKER |
|---|---|---|---|---|---|---|---|---|
| SIZE K | 38.05 | 38.0472 | 0.05 | -0.0028 | yyyy-mm-dd | xx:yy | NaN | NaN |
| POSN Y | 0 | 0.0025 | 0 | 0.0025 | yyyy-mm-dd | xx:yy | NaN | NaN |
| SIZE K | 8 | 8.0989 | 0.2 | 0.0989 | yyyy-mm-dd | xx:yy | 70 | PICKER |
| POSN Y | 0 | -0.0246 | 0 | -0.0246 | yyyy-mm-dd | xx:yy | 70 | PICKER |
内容的提问来源于stack exchange,提问作者Holmbrero
相关产品推荐
相关产品推荐

