将 CSV 文件转换为 JSON 文件

我正在尝试将我的 CSV 文件转换为 JSON 文件格式。当我这样做时,JSON 文件中有一个额外的条目,它只包含字段名称。


我尝试过使用熊猫、字典,但似乎无法得到结果。某事或其他事来了。


我想在 JSON 开头删除额外的文件名条目。另外,我怎样才能使 ConnectionId 作为键并为不同的输出设置相同的格式。


import csv, json


csvfile = 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

        }


胡说叔叔
浏览 307回答 2
2回答

隔江千里

尝试用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 filewith open(jsonFile, "w") as jsonFile:    jsonFile.write(json.dumps(arr, indent = 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 csvimport jsonwith 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))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python