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))
请同时参考此链接。
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))
添加回答
举报