Python 如何将包含数组数据的csv文件转换为json文件?

Python 如何将包含数组数据的csv文件转换为json文件?,python,arrays,json,csv,Python,Arrays,Json,Csv,我有一个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"] }, { first

我有一个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
置于对象“pets”之外。它还向数组项添加反斜杠

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

这是因为您正在对它进行编码,然后使用
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字符串的转义,这是序列化它两次的结果。

ah真棒。因此,如果JSON.dumps对其进行编码,那么使用另一种编码有什么意义呢?我相信
JSON.dumps
只是一个在幕后使用
jsonecoder
类的函数。在这种情况下,您只需要使用一个就可以完成工作。此外,由于这只是一个小问题,您能否在回答中编辑我如何避免出现空白的
pet
列?我不想进入我的数组
宠物:[“狗”,“狗”,“狗]
。我只希望它有
“狗”
是的<代码>记录['pets']=[x代表记录['pets']中的x,如果x不是“”。