Python 将 JSON 转换为 CSV

Posted

技术标签:

【中文标题】Python 将 JSON 转换为 CSV【英文标题】:Python convert JSON to CSV 【发布时间】:2015-08-07 20:55:09 【问题描述】:

我有一个 JSON 文件,其中包含:


    "leaderboard": 
        "$": [
            
                "userId": 1432024286216,
                "userName": "Joe Bloggs",
                "score": 111111,
                "gameType": "standard",
                "dateCreated": 1432024397833,
                "_id": 1432024397833
            ,
            
                "userId": 1432024626556,
                "userName": "Jane Bloggs",
                "score": 222222,
                "gameType": "demo",
                "dateCreated": 1432024730861,
                "_id": 1432024730861
            
        ]
    ,
    "users": 
        "$": [
            
                "userId_U": 1432024286000,
                "userName_U": "Paul Bloggs",
                "score_U": 333333,
                "gameType_U": "standard",
                "dateCreated_U": 1432024397833,
                "_id_U": 1432024397833
            ,
            
                "userId_U": 1432024626777,
                "userName_U": "John Bloggs",
                "score_U": 444444,
                "gameType_U": "demo",
                "dateCreated_U": 1432024730861,
                "_id_U": 1432024730861
            
        ]
    

我正在尝试在 Python 中创建一个 CSV。 CSV 仅从“排行榜”数据对象创建标题:userId、userName 等,并为其填充相应的数据。因此,为每个用户创建一个列:userId、userName 等。

我开始编写此代码,但我正在创建“排行榜”和“用户”标题,并将它们的数据放在它们下方的一个单元格中。我的代码:

import json, csv

x = open('test/dbTest.json')

rows = json.load(x)
with open('test.csv', 'wb+') as f:
    dict_writer = csv.DictWriter(f, fieldnames=['leaderboard', 'users'])
    dict_writer.writeheader()
    dict_writer.writerow(rows)

我尝试将字段名称更改为 'userId' 、 'userName' 等,但随后出现错误:

ValueError: dict contains fields not in fieldnames: u'users', u'leaderboard'

如何提取我需要的数据?为什么上面的代码不正确?

此外,CSV 应如下所示:

userId,userName,score,gameType,dateCreated,_id,
1432024286216,Joe Bloggs,111111,standard,1432024397833,1432024397833
1432024626556,Jane Bloggs,222222,demo,1432024730861,1432024730861

为了澄清,“用户”和“排行榜”因字段名称不同而不同。

【问题讨论】:

您的 JSON 中有多个“表格”数据。您要将哪个转换为 CSV? 或者usersuserboard是等价的吗? 请edit 提出您的问题并包含一个示例,说明此 JSON 的 CSV 应该是什么样子。 我想要“排行榜”中“$”内的数据,所以“userId”、“userName”、“score”、“gameType”、“dateCreated”、“_id”全部用于“排行榜” " 仅限。 'users' 和 'leaderboard' 字段名称不同 【参考方案1】:
# json_data being the literal file data, in this example

import json
import csv

data = json.loads(json_data)['leaderboard']['$']

with open('/tmp/test.csv', 'w') as outf:
    dw = csv.DictWriter(outf, data[0].keys())
    dw.writeheader()
    for row in data:
        dw.writerow(row)

【讨论】:

好吧,我通过将您的 json 数据作为字符串加载到“json_data”变量中来测试它。在您的示例中,您使用 json.load() 从文件中加载它。您可以直接使用它,但请确保在末尾添加 ['leaderboard']['$'] 部分 感谢您的解决方案,我现在知道我应该做什么了,只加载我需要的特定数据。现在可以了,很抱歉没有使用 load() 命令来加载 JSON。然而,输出在每行数据之后都有一个额外的空白行。所以它有标题行,然后是空白行,然后是数据行,然后是空白行,然后是另一个数据行等。有什么办法解决这个问题? 还说如果我需要在写入 CSV 之前格式化数据字段(如分数),我该怎么做? 在这种情况下,我建议手动进行,我会阅读 csv 模块的文档 这能回答你的问题吗?如果是这样,请将其标记为答案:)

以上是关于Python 将 JSON 转换为 CSV的主要内容,如果未能解决你的问题,请参考以下文章

Python:将 JSON 对象转换为 JSON 数组

Python - 如何将 JSON 文件转换为数据框

将 json 对象数组转换为 tsv (python)

将 JSON 数组转换为 Python 列表

python 使用eval() 可以将json格式的数据,转换为原始数据

无法使用 Python 将 JSON 文件转换为 CSV