如何读取头部格式不统一的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
相关产品推荐
相关产品推荐

