使用其他关键字/组织将csv导入json / dict

时间:2017-05-01 03:43:31

标签: json python-3.x csv dictionary

我正在尝试将.csv转换为json / dict,以便以当前形式显示数据:

<div [innerHtml]="decode(object.value)"></div>

我目前正在使用这样的东西(以及使用pandas.df bc导入它将用于从json文件绘图):

cat1,cat2,cat3,name
1,2,3,a
4,5,6,b
7,8,9,c

我希望它以json / dict格式显示:

with open('Data.csv') as f:
    reader = csv.DictReader(f)
    rows = list(reader)

print (rows)

[{'cat1': '1', 'name': 'a', 'cat3': '3', 'cat2': '2'}, 
 {'cat1': '4', 'name': 'b', 'cat3': '6', 'cat2': '5'}, 
 {'cat1': '7', 'name': 'c', 'cat3': '9', 'cat2': '8'}]

直接导入不允许我在'all_cats'下包含'cat1','cat2','cat3'并将'name'分开。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

由于它的空格分隔而不是逗号分隔,因此您必须添加delimiter=" "。此外,由于您的某些行预先有空格,这意味着您还必须添加skipinitialspace=True

reader = csv.DictReader(f, delimiter=" ", skipinitialspace=True)
rows = list(dict(row) for row in reader)

因此,如果你现在这样做:

for row in rows:
    print(row)

输出将是:

{'cat1': '1', 'cat2': '2', 'cat3': '3', 'name': 'a'}
{'cat1': '4', 'cat2': '5', 'cat3': '6', 'name': 'b'}
{'cat1': '7', 'cat2': '8', 'cat3': '9', 'name': 'c'}

答案 1 :(得分:0)

正如在其他答案中已经提到的那样,您没有为要实现的目标指定有效的JSON格式。您可以使用json.loads(jsonDATAstring)函数检查字符串是否包含有效的JSON格式:

import json
jsonDATAstring_1 = """
{"data: [{"all_cats": {"cat1": 1}, {"cat2": 2}, {"cat3": 3}}, "name": a},
         {"all_cats": {"cat1": 4}, {"cat2": 5}, {"cat3": 6}}, "name": b},
         {"all_cats": {"cat1": 7}, {"cat2": 8}, {"cat3": 8}}, "name": c}]}
"""
json.loads(jsonDATAstring_1)

如果您指定了预期的JSON格式,则会产生以下结果:

json.decoder.JSONDecodeError: Expecting ':' delimiter: line 2 column 12 (char 12)

从我的问题中我所知道的,我假设您想要得到的JSON字符串是以下字符串:

jsonDATAstring_2 = """
{"data": [{"all_cats": {"cat1": 1, "cat2": 2, "cat3": 3}, "name": "a"},
          {"all_cats": {"cat1": 4, "cat2": 5, "cat3": 6}, "name": "b"},
          {"all_cats": {"cat1": 7, "cat2": 8, "cat3": 8}, "name": "c"}]}
"""
json.loads(jsonDATAstring_2)

第二个字符串加载OK,所以假设:

rows = [{'cat1': '1', 'name': 'a', 'cat3': '3', 'cat2': '2'}, 
        {'cat1': '4', 'name': 'b', 'cat3': '6', 'cat2': '5'}, 
        {'cat1': '7', 'name': 'c', 'cat3': '9', 'cat2': '8'}]

您可以按照以下方式获得所需内容:

dctData = {"data": []}
lstCats = ['cat1', 'cat2', 'cat3']
for row in rows:
    dctAllCats  = {"all_cats":{}, "name":"?"}
    for cat in lstCats:
        dctAllCats["all_cats"][cat] = row[cat]
    dctAllCats["name"] = row["name"]
    dctData["data"].append(dctAllCats)

import pprint
pp = pprint.PrettyPrinter()
pp.pprint(dctData)

是什么赋予:

{'data': [{'all_cats': {'cat1': '1', 'cat2': '2', 'cat3': '3'}, 'name': 'a'},
          {'all_cats': {'cat1': '4', 'cat2': '5', 'cat3': '6'}, 'name': 'b'},
          {'all_cats': {'cat1': '7', 'cat2': '8', 'cat3': '9'}, 'name': 'c'}]}

现在可以将Python字典对象序列化为JSON字符串(或文件):

jsonString = json.dumps(dctData)
print(jsonString)

是什么赋予:

{"data": [{"all_cats": {"cat1": "1", "cat2": "2", "cat3": "3"}, "name": "a"}, {"all_cats": {"cat1": "4", "cat2": "5", "cat3": "6"}, "name": "b"}, {"all_cats": {"cat1": "7", "cat2": "8", "cat3": "9"}, "name": "c"}]}