【问题标题】:How to convert a csv file, that has array data, into a json file?如何将包含数组数据的 csv 文件转换为 json 文件?
【发布时间】:2015-09-12 08:18:38
【问题描述】:

我有一个包含一堆列的 CSV 文件。 一些列是相同的,但我想将它们转换为 JSON 对象,它们都位于同一个数组下。

例如在 CSV 中:

firstname,lastname,pet,pet,pet
Joe, Dimaggio, dog, cat
Pete, Rose, turtle, cat
Jackie, Robinson, dog

我希望 JSON 是

{ firstname: Joe,
  lastname: Dimaggio,
  pets: ["dog", "cat"]
},
{ firstname: Pete,
  lastname: Rose,
  pets: ["turtle", "cat"]
},
{ firstname: Jackie,
  lastname: Robinson,
  pets: ["dog"]
}

我正在尝试编写一个简单的 Python 脚本来执行此操作,但我遇到了问题。

这是我目前所得到的:

import csv
import json

csvfile = open('userdata.csv', 'r')
jsonfile = open('userdata.json', 'w')

fieldnames = ("firstname", "lastname", "pet", "pet", "pet");
reader = csv.DictReader( csvfile, fieldnames)
record = {}
for row in reader:
    record['firstname'] = row['firstname']
    record['lastname'] = row['lastname']
    record['pets'] = json.JSONEncoder().encode({"pets": [row['pet'], row['pet'], row['pet'], row['pet'], row['pet']]});
    json.dump(record, jsonfile, indent=4)
    ##json.dump(json.loads(json.JSONEncoder(record)), jsonfile, indent=4)
print "something worked"

但这很有趣,因为它将pets 打印为一个名为pets 的对象内的数组。

我不知道如何在对象 `pets.它还在数组项中添加反斜杠

{
    "firstname": "Joe",
    "lastname": "Dimaggio", 
    "pets": "{\"pets\": [\"dog\", \"cat\"]}"
}

【问题讨论】:

    标签: python arrays json csv


    【解决方案1】:

    这是因为您正在对其进行编码,然后使用json.dumps,这基本上是对其进行了两次编码。删除json.JSONEncoder().encode(...),它应该可以正常工作。

    import csv
    import json
    
    csvfile = open('userdata.csv', 'r')
    jsonfile = open('userdata.json', 'w')
    
    fieldnames = ("firstname", "lastname", "pet", "pet", "pet");
    reader = csv.DictReader( csvfile, fieldnames)
    record = {}
    for row in reader:
        record['firstname'] = row['firstname']
        record['lastname'] = row['lastname']
        record['pets'] = [[row['pet'], row['pet'], row['pet'], row['pet'], row['pet']]
        # Remove blank entries
        record['pets'] = [x for x in record['pets'] if x is not '']
        json.dumps(record, jsonfile, indent=4)
    print "something worked"
    

    您看到的反斜杠是对 json 字符串进行转义,是对它进行了两次序列化的结果。

    【讨论】:

    • 啊太棒了。那么如果 JSON.dumps 对其进行编码,那么进行另一个编码又有什么意义呢?
    • 我相信json.dumps 只是一个在幕后使用JSONEncoder 类的函数。在这种情况下,您只需要使用一个即可完成工作。
    • 也因为这只是一个小问题,你能在你的答案中编辑我如何避免pet 列是空白的吗?我不想进入我的数组pets: ["dog", "", ""]。我只希望它有"dog"
    • 是的! record['pets'] = [x for x in record['pets'] if x is not '']
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    相关资源
    最近更新 更多