【问题标题】:How to convert CSV to JSON?如何将 CSV 转换为 JSON?
【发布时间】:2018-02-15 22:07:10
【问题描述】:

我有一个 CSV 文件,标题为键,数据为值。我的目标是将 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
...

【问题讨论】:

    标签: python json csv dictionary


    【解决方案1】:

    您可以使用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)
    

    【讨论】:

    • 我的内容与您的建议类似,但我无法按照我需要的方式打印输出。所以我知道我不能做 json_data["Key"] 来打印 >> 'Value 1'..... 因为它不是元组
    • @AlexisChen json_data 是一个字符串...如果你想打印 k-v 对,你需要访问 data[i]
    • 谢谢!我想通了 :) 我写了一个 for 循环来访问 k-v 对
    【解决方案2】:

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

    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])
    

    这应该在控制台中给出预期的输出,如问题所述

    【讨论】:

      【解决方案3】:

      如果您将数据加载到数据框中,您可以尝试使用.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))来获取每一行的map column->value,这样更快。在这种情况下,你根本不需要 pandas。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-23
        • 2019-08-21
        相关资源
        最近更新 更多