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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:42:53