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
相关产品推荐
相关产品推荐

