处理utf-16编码多分段Schema CSV文件转字典方案求助
适配分段Schema的CSV解析实现方案
问题根因
之前直接用csv.DictReader解析出错的核心原因是,DictReader默认会把文件第一行作为全局固定表头映射,完全适配不了这类前后结构不一致的文件:前半段两列键值对会被错误绑定第一行的表头字段,后半段的四列表头触发结构不匹配,最终输出格式完全错乱。
实现思路
跳过带固定全局表头的读取逻辑,逐行识别结构切换的临界点,对两个分段分别解析后合并为统一字典结构:
- 不硬编码第50行的分割位置:通过行拆分后的列数识别结构切换点,避免行数偏移导致的解析错误
- 前半段两列键值对:逐行拆成key-value存入元数据字段
- 后半段四列结构:将切换行作为表头,后续每一行匹配表头转为字典条目存入列表字段
可直接运行的代码
def parse_split_schema_csv(filename): parsed_result = { "meta_kv": {}, "structured_data": [] } # 按行读取原始内容,逐行校验结构 with open(filename, 'r', encoding='utf-16') as f: raw_lines = f.read().splitlines() # 自动定位结构切换的位置:找到第一个拆分为4列的行 switch_line_idx = None for idx, line in enumerate(raw_lines): cleaned_cols = [col.strip() for col in line.split(';')] if len(cleaned_cols) == 4: switch_line_idx = idx break if switch_line_idx is None: raise RuntimeError("未检测到四列结构的切换行,请检查文件内容") # 解析前半段的两列键值对 for line in raw_lines[:switch_line_idx]: if not line.strip(): continue cleaned_cols = [col.strip() for col in line.split(';')] if len(cleaned_cols) == 2: parsed_result["meta_kv"][cleaned_cols[0]] = cleaned_cols[1] # 解析后半段的四列表格内容 table_headers = [col.strip() for col in raw_lines[switch_line_idx].split(';')] for line in raw_lines[switch_line_idx + 1:]: if not line.strip(): continue row_cols = [col.strip() for col in line.split(';')] parsed_result["structured_data"].append(dict(zip(table_headers, row_cols))) return parsed_result # 调用方式 if __name__ == "__main__": file_path = "your_target_file.csv" final_dict = parse_split_schema_csv(file_path) print(final_dict)
实操注意事项
- 保留原文件的编码参数:你当前用的
utf-16适配这类带分段结构的导出文件是正确的,不要随意改成utf-8或gbk,否则会出现乱码 - 增加空行过滤逻辑:很多业务系统导出的CSV会穿插空行,不跳过的话容易出现列数计算错误,误判结构切换位置
- 适配Pandas分析需求时,可直接把
parsed_result["structured_data"]传给pd.DataFrame()生成分析用的数据集,不需要强行用Pandas读取整个分段结构的文件,否则极易触发schema推断错误
内容的提问来源于stack exchange,提问作者Konstantinos Paliouras
相关产品推荐
相关产品推荐

