如何使用Python解析树结构CSV文件生成父子关系对应表
带层级前导逗号的CSV父子关系解析方案
待处理CSV共3000行,节点层级由行首逗号数量决定,内容示例如下:
A, ,B ,,B1 ,,B2 ,,,,,B2a ,C ,,C1 ,,,C1a ,,C2 ,,,,,C2a1a需输出包含Parent、Child两列的父子对应表,叶子节点需关联到最近的上层父节点,预期输出示例:
Parent Child A B B B1 B B2 B2 B2a A C C C1 C1 C1a C C2 C2 C2a1a
实现思路
- 逐行读取文件,去除行尾空白、末尾多余逗号,过滤空行
- 计算每行开头的连续逗号数量作为当前节点的层级
- 维护一个层级映射表,存储每个层级对应的最新节点名称
- 层级为0的根节点无父节点,仅存入层级映射表
- 其余层级节点的父节点为层级映射表中「当前层级-1」对应的节点值
- 每处理完成一个节点,更新层级映射表中当前层级的节点值,确保后续更深层级节点能匹配到最近父节点
Python实现代码
import csv # 存储各层级对应的最新节点,key为层级数,value为节点名称 level_map = {} result = [["Parent", "Child"]] # 替换为你的CSV文件路径 with open("tree_data.csv", "r", encoding="utf-8") as f: for line in f: # 去除首尾空白和行尾多余逗号 processed_line = line.strip().rstrip(",") if not processed_line: continue # 计算前导逗号数量即层级 leading_comma_count = len(processed_line) - len(processed_line.lstrip(",")) current_node = processed_line.lstrip(",") # 根节点无需处理父级关系 if leading_comma_count == 0: level_map[leading_comma_count] = current_node continue # 取上一级的最新节点作为父节点 parent_node = level_map[leading_comma_count - 1] result.append([parent_node, current_node]) # 更新当前层级的最新节点 level_map[leading_comma_count] = current_node # 输出结果到新文件 with open("parent_child_result.csv", "w", encoding="utf-8", newline="") as f: writer = csv.writer(f, delimiter=" ") writer.writerows(result)
上述代码可直接处理3000行规模的CSV无性能压力,输出结果完全匹配预期要求。
内容的提问来源于stack exchange,提问作者Edomfra
相关产品推荐
相关产品推荐

