如何将CSV转换为JSON?

时间:2017-09-07 08:41:17

标签: python json csv dictionary

我有一个CSV文件,标题为Key,数据为Value。我的目标是将CSV文件转换为Json以上传到数据库并输出我上传的数据。我已成功将CSV转换为Json,但我的输出有问题。

我目前拥有什么

import csv
import json
import pandas as pd
csvfile = open ('so-emissions-by-world-region-in-million-tonnes.csv','r')
reader = csv.DictReader(csvfile)
result = []
for row in reader:
    result.append(row)
result = json.dumps(result)
result = json.loads(result)
keys = ('Entity' ,'Year','SO2 emissions- Clio Infra')
print(result)

CSV数据:

[{'502 emissions- Clio Infra': '0', 'Entity': 'Africa', 'Year': '1860 '},
 {'502 emissions- Clio Infra': '0', 'Entity': 'Africa', 'Year': '1870'},
 {'502 emissions- Clio Infra': '0.059', 'Entity': 'Africa', 'Year': '1880'},
 {'502 emissions- Clio Infra': '0.065', 'Entity': 'Africa', 'Year': '1890'},
 {'502 emissions- Clio Infra': '0.071', 'Entity': 'Africa', 'Year': ' 1900'},
 {'502 emissions- Clio Infra': '0.146', 'Entity': 'Africa', 'Year': '1910'},
 {'502 emissions- Clio Infra': '0.372', 'Entity': 'Africa', 'Year': '1920'},
 {'502 emissions- Clio Infra': '0.41', 'Entity': 'Africa', 'Year': ' 1930'},
 {'502 emissions- Clio Infra': '0.56 ', 'Entity': 'Africa', 'Year ': '1940'}]

This is the output of result

正确输出:

'First Key'
Value 1
Value 2
Value 3
...
'Second Key'
Value 1
Value 2
Value 3
...
'Third Key'
Value 1
Value 2
Value 3
...

3 个答案:

答案 0 :(得分:8)

您可以使用csv.DictReader读取您的CSV,然后使用json.dumps将其输出序列化。

import csv
import json

data = []
with open('file.csv') as f:
    for row in csv.DictReader(f):
        data.append(row)

json_data = json.dumps(data)

答案 1 :(得分:1)

您当前正在打印字典本身的结果,如果您希望以问题中显示的格式获得输出,则需要通过字典打印出每个键及其值

for key in keys:  #looking through each key
    print (key)
    for i in results:  #going through the results and printing the value of the index with the current key
        print (results[i][key])

这应该在问题中提到控制台中的预期输出

答案 2 :(得分:1)

如果您在数据框中加载数据,则可以尝试使用.to_dict

df = pd.read_csv('so-emissions-by-world-region-in-million-tonnes.csv')
df.T.to_dict().values()

.to_dict()按地图在地图中转换数据框(对于每个列,您都有索引 - >值)。通过转置和使用.to_dict,这是一个按行划分的地图(对于每个索引,您都有一个地图列 - >值)。您不需要密钥,因此请执行.values()

注意,如果你使用的是python 3.5,这是一个dict_values对象,所以你可能想在转换为json之前使用list()

顺便说一下,您还可以使用dict(zip(columns, values))获取每行的地图列 - >值,这样会更快。在这种情况下,你根本不需要大熊猫。

编辑:如果csv没有标题,则需要在pd.read_csv()中使用关键字names=

传递它