如何使用Python将带缺失值的特定格式CSV转换为指定层级结构的JSON
自定义CSV转层级JSON的Python实现
首先,我明确你的核心需求:忽略CSV前两行(属性和单位),保留空单元格的原始含义(等同于前一行对应值),并将数据组织成val1 -> val2 -> val3 -> [数据列表]的层级JSON结构,同一层级组合下的多行数据会被收集到同一个数组中。
下面是修改后的完整代码:
import csv import json def make_json(csvFilePath, jsonFilePath): # 初始化最终的层级数据结构 data = {} # 保存前一行的所有值,用于处理空单元格的含义(空=前一行对应值) prev_row = [""] * 9 # 对应CSV的9列 with open(csvFilePath, mode='r', encoding='utf-8-sig') as csvf: csv_reader = csv.reader(csvf, delimiter=',') # 跳过前两行:属性行和单位行 next(csv_reader) next(csv_reader) for row in csv_reader: # 处理当前行:空单元格直接沿用前一行对应位置的值,不做填充 current_row = [cell if cell.strip() != "" else prev_row[i] for i, cell in enumerate(row)] # 提取层级键和数据部分 val1 = current_row[0] val2 = current_row[1] val3 = current_row[2] data_list = current_row[3:] # 对应p4到p9的所有值 # 逐步构建层级结构 # 确保val1的层级存在 if val1 not in data: data[val1] = {} # 确保val2在val1下的层级存在 if val2 not in data[val1]: data[val1][val2] = {} # 确保val3在val2下是数组类型 if val3 not in data[val1][val2]: data[val1][val2][val3] = [] # 将当前数据列表添加到对应层级 data[val1][val2][val3].append(data_list) # 更新前一行数据,供下一行处理空单元格使用 prev_row = current_row.copy() # 写入JSON文件,格式化输出 with open(jsonFilePath, 'w', encoding='utf-8') as jsonf: json.dump(data, jsonf, indent=4) # 配置文件路径 csvFilePath = r'./data/chart-0.csv' jsonFilePath = r'./js/try.js' # 执行转换 make_json(csvFilePath, jsonFilePath)
关键改动说明
- 替换DictReader为csv.reader:因为我们需要忽略前两行表头,手动控制每一行的处理逻辑,
csv.reader比DictReader更适合这种场景,避免表头干扰。 - 保留空单元格的原始逻辑:新增
prev_row变量存储上一行的所有值,当前行的空单元格直接继承前一行对应位置的值,严格遵循你要求的“无法填充缺失值”的规则。 - 构建层级化JSON结构:通过三层判断确保每个层级的键存在,同一
val1-val2-val3组合下的所有行数据都会被收集到同一个数组中。 - 跳过无关行:使用
next(csv_reader)两次直接跳过属性行和单位行,不需要处理这两行的内容。
运行这段代码后,你会得到符合预期的层级JSON结构,比如针对你提供的示例CSV,输出的JSON会是:
{ "10": { "500": { "10": [ ["10", "6.192187", "0", "0", "10.3313", "8.58659"] ] } }, "2": { "150": { "5": [ ["3", "6.7125", "8.497266", "9.130859", "6.46657", "7.645142111"], ["4", "6.960938", "9.472656", "", "6.64784", "8.060439698"], ["5", "7.819531", "0", "0", "6.88975", "8.972818303"] ] } } }
内容的提问来源于stack exchange,提问作者Lrom
相关产品推荐
相关产品推荐

