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

Python 2.7基于标准库将在线压缩CSV转嵌套JSON的解析难题

解决Python 2.7下CSV转嵌套JSON的解析问题

嘿,我来帮你搞定这个解析环节的难题!既然你已经搞定了文件获取和解压,那咱们就聚焦在CSV解析和目标JSON构建上,全程只用Python 2.7的标准库就行~

核心思路

咱们的目标是把CSV里的每行数据,按第0、2、3、4列组合成主键,每个主键对应包含三个顶层元素的结构:主键本身、观测值时间序列字典(日期:观测值),以及你提到的“等”(这里我先留好扩展位置,你可以根据需求补充)。

代码实现

我直接给你写好可复用的代码,里面加了详细注释,你可以根据自己的CSV实际情况调整:

import csv
import json
from collections import defaultdict

def csv_to_nested_json(csv_file):
    # 用defaultdict自动初始化每个主键的结构,省得每次判断键是否存在
    data_dict = defaultdict(lambda: {
        "primary_key": "",
        "observation_timeseries": {},
        # 这里可以添加第三个顶层元素,比如"metadata": {},根据你的需求补全
    })

    # 初始化CSV读取器
    reader = csv.reader(csv_file)
    # 如果你的CSV有表头,记得跳过这一行;没有的话就删掉下面这句
    header = next(reader)

    for row in reader:
        # 组合主键:把第0、2、3、4列用下划线拼接(分隔符可以自己换)
        # 注意:如果某列可能为空,建议加判断避免空字符串拼接,比如:
        # primary_key_parts = [part for part in [row[0], row[2], row[3], row[4]] if part]
        primary_key_parts = [row[0], row[2], row[3], row[4]]
        primary_key = "_".join(primary_key_parts)
        
        # 这里要注意!日期和观测值的列索引请根据你的CSV实际情况修改!
        # 假设日期在第1列,观测值在第5列,你要换成自己的列号
        date = row[1]
        observation = row[5]
        # 如果观测值是数字类型,记得转成float/int,比如:observation = float(row[5])

        # 更新当前主键对应的结构
        entry = data_dict[primary_key]
        entry["primary_key"] = primary_key
        # 把日期和观测值加入时间序列字典
        entry["observation_timeseries"][date] = observation

    # 把字典转成格式化的JSON字符串,ensure_ascii=False支持非ASCII字符(比如中文)
    result = json.dumps(list(data_dict.values()), indent=4, ensure_ascii=False)
    return result

# 调用示例(假设你用gzip解压文件,其他解压方式同理)
# import gzip
# with gzip.open('your_compressed_file.csv.gz', 'rb') as compressed_file:
#     json_output = csv_to_nested_json(compressed_file)
# print(json_output)

关键注意点

  • 表头处理:如果你的CSV没有表头,一定要删掉header = next(reader)这句,不然会把第一行数据当成表头跳过。
  • 列索引调整:代码里的日期、观测值列索引是我假设的,你必须换成自己CSV对应的列号(索引从0开始)。
  • 数据类型转换:如果观测值是数字(比如温度、数值),记得把observation = row[5]改成observation = float(row[5])或者int(row[5]),不然JSON里会存成字符串。
  • 空值与异常处理:如果CSV里可能有缺失值或者行数不一致的情况,建议加个try-except块,避免程序崩溃,比如:
    try:
        primary_key_parts = [row[0], row[2], row[3], row[4]]
        # 其他逻辑...
    except IndexError:
        print(f"跳过格式错误的行:{row}")
        continue
    
  • Python2.7编码问题:如果CSV里有中文或其他非ASCII字符,建议用codecs模块包装文件对象,比如:
    import codecs
    # 假设解压后的文件是compressed_file(rb模式打开的字节流)
    utf8_file = codecs.getreader('utf-8')(compressed_file)
    json_output = csv_to_nested_json(utf8_file)
    

内容的提问来源于stack exchange,提问作者user3236992

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:32:16