繁体   English   中英

Python 将 CSV 转换为自定义 JSON 格式时的类型问题

[英]Python Type issue when Converting a CSV to custom JSON format

我正在尝试将 CSV 转换为特定格式。 我已成功获得所需的格式,但我现在意识到它已将所有 csv 值视为字符串,其中一些应该是浮点数、文字或整数。

是否有一种方法可以将列值正确格式化为 JSON 转储所需的格式。 我相信还有一种更简单的方法可以实现这一点。

j = []

with open("output.csv") as f:
    reader = csv.DictReader(f, delimiter=",")
    for row in reader:

    row["id"] = row["Id2"]
    row["ideca"] = row["schemaV"]
    row["schem"] = row["schema"]
    row["lore"] = row["serialNumber"]
    row["tore"] = row["msgschem"]
    row["fore"] = row["dschema"]
    row["created"] = row["created"]
    row["loaded"] = row["created"]

    row["geometry1"] = {
        "type": "point",
        "coordinates": row["latlong"]
    }

    row["location1"] = {
        "timestamp": row["timestamp"],
        "geometry": row["geometry1"]
    }

    row["ignition1"] = {
        "timestamp": row["timestamp"],
        "state": row["Value"]
    }

    row["data"] = {
      "engine_status": row["Value"],
      "state": row["Value"],
      "switch_status": row["Value"],
      "latitude": row["lat"],
      "longtitude": row["long"],
      "plantNumber": row["plantno"],
      "ignition": row["ignition1"],
      "location": row["location1"]

    }


    del(row[""])
    del(row["Epoch"])
    del(row["AssetId"])
    del(row["Value"])
    del(row["lat"])
    del(row["long"])
    del(row["serialNumber"])
    del(row["plantno"])
    del(row["msgschem"])
    del(row["dschema"])
    del(row["created"])
    del(row["intEpoch"])
    del(row["timestamp"])
    del(row["latlong"])
    del(row["Id"])
    del(row["Id2"])
    del(row["ignition1"])
    del(row["geometry1"])
    del(row["location1"])

    # Collect the changed row in the list of rows.
    j.append(row)

print(json.dumps(j, indent=4))

数据示例如下:

    Id  Epoch   AssetId Value   lat long    serialNumber    plantno Id2 schemaV schema  msgschem    dschema created intEpoch    timestamp   latlong
0   1538317366  875 0   -1.6478 1.9428  1688889 1042225 168888;1538317366   1    d2xxxage    mxxx;v1    Sxxxxs  154900000   15900000    30/09/2018  2:22:46 PM  [ -1.647766499999996, 1.9428143 ]

@Ari 是正确的。 简单地说:

"state": float(row["Value"])

解决了问题

通过将内容放入row字典然后必须再次清理,您的代码很复杂。 我会做一些更类似于:

import csv
import json

results = []
for row in csv.DictReader(fileobj):
    # parse non-string columns
    value = float(row["Value"])
    latlong = json.loads(row['latlong'])

    # create nested structures
    ignition = {
        "timestamp": row["timestamp"],
        "state": value,
    }
    location = {
        "timestamp": row["timestamp"],
        "geometry": {
            "type": "point",
            "coordinates": latlong,
        }
    }

    # create dict and append to results
    results.append({
        'id': row['Id2'],
        'ideca': row["schemaV"],
        'schem': row["schema"],
        'lore': row["serialNumber"],
        'tore': row["msgschem"],
        'fore': row["dschema"],
        'loaded': row["created"],
        'engine_status': value,
        'state': value,
        'switch_status': value,
        'latitude': row["lat"],
        'longtitude': row["long"],
        'plantNumber': row["plantno"],
        'ignition': ignition,
        'location': location,
    })

请注意,我还在解析 JSON 看起来latlong列,希望这很有用。 看到代码中的相关内容有点尴尬,所以事情可能会发生一些变化,但希望这样更容易看到发生了什么

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM