Python将S3读取的CSV字符串列表转为指定JSON格式的问询
CSV转指定格式JSON的解决方案
问题背景
现有如下格式的CSV数据(每行字段数量可变,但必含devid和devType):
devid,1, devType,"type-928" devid,2, devType,"type-930"
已从S3获取到以\r分隔的字符串列表:
Devices = ['devid,1,devType,"type-928"\r', 'devid,2,devType,"type-930"'] for device in Devices: device_data = device.split(',') print(device)
拆分后得到的列表存在键值配对错误(直接用zip会出现1与devType配对的问题),且需要生成指定结构的JSON,同时避免数组末尾元素后出现多余逗号。
实现步骤
1. 正确配对键值对
不要直接用zip处理整个拆分后的列表,按步长2遍历实现“第1与第2、第3与第4元素依次配对”的逻辑,同时清理数据中的冗余符号:
import json Devices = ['devid,1,devType,"type-928"\r', 'devid,2,devType,"type-930"'] result = {"data": []} for device in Devices: # 先去除换行符,再拆分字段 cleaned_line = device.strip('\r') fields = cleaned_line.split(',') device_dict = {} # 按步长2遍历,每组为一个键值对 for i in range(0, len(fields), 2): key = fields[i].strip() # 清理键名中的空格(比如原始的" devType") value = fields[i+1].strip('"') # 去除值的引号 device_dict[key] = value # 将devid转换为数字类型 if 'devid' in device_dict: device_dict['devid'] = int(device_dict['devid']) # 仅保留需要的字段 filtered_item = {k: v for k, v in device_dict.items() if k in ['devid', 'devType']} result["data"].append(filtered_item)
2. 自动处理JSON逗号问题
不要手动拼接JSON字符串,直接用Python内置的json模块序列化数据,它会自动处理数组元素的逗号,不会在最后一个元素后生成多余逗号:
# 输出格式化后的JSON print(json.dumps(result, indent=2))
执行后将得到符合要求的结果:
{ "data": [ { "devid": 1, "devType": "type-928" }, { "devid": 2, "devType": "type-930" } ] }
额外优化:应对复杂CSV场景
如果CSV字段值可能包含逗号(比如devType,"type-928,pro"),直接用split(',')会出错,建议用Python内置的csv模块解析,兼容性更强:
import csv import json from io import StringIO Devices = ['devid,1,devType,"type-928"\r', 'devid,2,devType,"type-930"'] result = {"data": []} for device in Devices: # 用csv模块解析每行数据,自动处理含逗号的字段值 reader = csv.reader(StringIO(device.strip('\r'))) row = next(reader) device_dict = {} for i in range(0, len(row), 2): key = row[i].strip() value = row[i+1].strip('"') device_dict[key] = value if 'devid' in device_dict: device_dict['devid'] = int(device_dict['devid']) filtered_item = {k: v for k, v in device_dict.items() if k in ['devid', 'devType']} result["data"].append(filtered_item) print(json.dumps(result, indent=2))
内容的提问来源于stack exchange,提问作者Fakir
相关产品推荐
相关产品推荐

