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

如何读取头部格式不统一的CSV文件并分别解析头部与结构化数据

问题解决方法

你碰到的索引越界错误本质是csv.reader的返回规则导致的:

  • 第二种格式里无逗号的单行内容,读出来是长度为1的列表,不存在下标为1的元素
  • 空行读出来是长度为0的空列表,连row[0]都不存在

具体解决步骤

1. 元信息提取逻辑兼容两种格式

两类文件的前4行第一列内容完全一致,无需判断后续空列,直接取row[0]做正则匹配即可:

2. 索引越界修复

所有下标访问前必须先判断列表长度,不要直接访问不存在的下标,比如要判断第二列是否为空,需要先判断len(row)>=2再做取值

3. 数据起始行识别

不用硬卡行号,用「行非空+第一列是数字+列数符合结构化标准」三个条件组合判断,两类格式都能适配


完整可运行示例代码

import csv
import re

# 存储提取的元信息
meta_info = {
    "operator_name": "",
    "export_time": "",
    "export_date": ""
}
# 存储结构化数据
standard_data = []
line_counter = 0
# 第一行元信息匹配正则,可根据实际格式调整
meta_regex = r"File For EMS Team Downloaded By ([\w\s]+) At (\d{2}:\d{2}:\d{2}) (\d{2}/\d{2}/\d{4})"

with open('file.csv', 'r', encoding='utf-8') as csvfile:
    csv_reader = csv.reader(csvfile)
    for row in csv_reader:
        line_counter += 1
        # 处理前4行元信息
        if line_counter <= 4:
            if len(row) >= 1 and row[0].strip() != "":
                if line_counter == 1:
                    match_result = re.match(meta_regex, row[0])
                    if match_result:
                        meta_info["operator_name"] = match_result.group(1)
                        meta_info["export_time"] = match_result.group(2)
                        meta_info["export_date"] = match_result.group(3)
            continue
        # 跳过所有空行(包括第二种格式的第5行空行)
        if len(row) == 0 or all([col.strip() == "" for col in row]):
            continue
        # 判断是否进入结构化数据段:第一列为数字、列数符合标准(示例为8列)
        if len(row) >= 1 and row[0].strip().isdigit() and len(row) >= 8:
            standard_data.append(row)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:48:01