为了账号安全,请及时绑定邮箱和手机立即绑定

将 CSV 文件转换为 JSON 文件

将 CSV 文件转换为 JSON 文件

胡说叔叔 2022-01-18 15:53:58
我正在尝试将我的 CSV 文件转换为 JSON 文件格式。当我这样做时,JSON 文件中有一个额外的条目,它只包含字段名称。我尝试过使用熊猫、字典,但似乎无法得到结果。某事或其他事来了。我想在 JSON 开头删除额外的文件名条目。另外,我怎样才能使 ConnectionId 作为键并为不同的输出设置相同的格式。import csv, jsoncsvfile = open('/home/Desktop/PD/GEOSubscriberLocations_LTE_sample.csv', 'r')jsonfile = open('/home/Desktop/PD/script5.json', 'w')fieldnames = ("Confidence", "ConnectionId", "Imei", "Imsi", "IsData", "IsSignalling", "IsVoice", "Latitude", "Longitude",              "Mcc", "Mnc", "SegmentDuration", "SegmentStartTime", "ServingCellLabel", "Sv",               "TrackingAreaCode", "Uncertainity")reader = csv.DictReader(csvfile , fieldnames)code = ''for row in reader:    for key in row:        row[key] = row[key].decode('utf-8', 'ignore').encode('utf-8')        json.dump(row, jsonfile, indent=4, sort_keys=False)        jsonfile.write('\n')如果使用 ConnectionId 作为键,我希望我的输出如下:{    "ConnectionId": "189970698469977",        {            "Confidence": "0.01428183",            "Imei": "99999507405260",            "Imsi": "999992226504812",            "IsData": "FALSE",            "IsSignalling": "TRUE",            "IsVoice": "FALSE",            "Latitude": "1.848613",            "Longitude": "1.354355",            "Mcc": "999",            "Mnc": "99",            "SegmentDuration": "00:00:00.0860000",            "SegmentStartTime": "16/02/2017 09:57:00.053",            "ServingCellLabel": "Cell14",            "Sv": "06",            "TrackingAreaCode": "1256",            "Uncertainty": 662        }
查看完整描述

2 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

尝试用for以下代码替换您的循环:


arr = []


with open (csvFile) as f:

    csvReader = csv.DictReader(f)

    #print(csvReader)

    for csvRow in csvReader:

        arr.append(csvRow)


print(arr)


# write the data to a json file

with open(jsonFile, "w") as jsonFile:

    jsonFile.write(json.dumps(arr, indent = 4))

请同时参考此链接。


查看完整回答
反对 回复 2022-01-18
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

额外的仅字段名称条目

如果您明确提供字段名,csv将假定 .csv 文件的第一行是数据。如果省略 fieldnames 参数,它将假定 .csv 文件的第一行是带有字段名称的标题行:


fieldnames 参数是一个序列。如果省略 fieldnames,则文件 f 的第一行中的值将用作字段名。


看起来您的 .csv 文件有一个标题行,但您还明确提供了字段名,因此csv已将标题行作为数据读取。要仅使用标题行中的字段名,请将您对 DictReader 的调用更改为:


csv.DictReader(csvfile)  # notice no fieldnames parameter

使用某个字段作为键

首先考虑如何最好地在 JSON 中表示这一点,以及您试图从该字段的索引中获得什么,您给出的示例不是很有效的 JSON。


{

    "ConnectionId": "189970698469977",

        {

            "Confidence": "0.01428183",

            "Imei": "99999507405260",

            ...

        }

它无效,因为:


我们打开一个{,表明这是一个“对象”

对象有键,以及与这些键关联的值,没有别的

我们为它提供一个键“ConnectionID”和一个值。这可以

然后我们提供另一个对象但没有密钥,这是无效的。

假设您希望能够根据 connectionId 快速查找对象,我们如何在 JSON 中创建一个如下所示的对象:


{

    "189970698469977": {

        "Confidence": "0.01428183",

        "Imei": "99999507405260",

        ...

    },

    "260339442647676": {

        "Confidence": ...

    },

    ...

}

这为我们提供了一种令人满意的属性,即 JSON 仅在键唯一时才有效。


为此,我们需要在 Python 中创建一个字典,我们将在 JSON 转储中表示:


我们可以从元组序列中创建 Python 字典(key, value)。文档中的示例:


>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])

{'sape': 4139, 'guido': 4127, 'jack': 4098}

我们将使用这个构造函数来创建我们的索引字典:


dictionaryEntries = [(row['ConnectionId'], row) for row in csvReader]

dictionaryToDump = dict(dictionaryEntries)

把它放在一起

您的代码现在可能如下所示:


import csv

import json


with open('mycsv.csv') as csvFile:

  csvReader = csv.DictReader(csvFile)

  dictionaryEntries = [(row['ConnectionId'], row) for row in csvReader]


dictionaryToDump = dict(dictionaryEntries)


with open('myjson.json', 'w') as jsonFile:

    jsonFile.write(json.dumps(dictionaryToDump))


查看完整回答
反对 回复 2022-01-18
  • 2 回答
  • 0 关注
  • 305 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信