python - 如何将具有数组数据的 csv 文件转换为 json 文件?

标签 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"]
},
{ 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 字符串进行转义,这是对它进行两次序列化的结果。

关于python - 如何将具有数组数据的 csv 文件转换为 json 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31055198/

相关文章:

python - 在多对多字段中使用 through 属性并遇到 "Non-Unique"字段要求

python - 排序 python 多维数组?

c++ - 数组偏移量和位#

Javascript 关系数据库

ruby-on-rails - 渲染包含 Float::NAN 对象的哈希时,Rails 返回无效的 JSON

Python 子进程只传递一个参数

python - 跟踪每日配额(自动过期增量)——Redis 还是 Pymongo?

python - 基于索引函数的数组的矢量化操作

php - 如何解码 google 搜索 api 结果?

javascript - JavaScript 中的 JSON 行提取问题