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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:12:35