如何在python中将json输出写入csv文件?

时间:2019-09-24 16:19:51

标签: python json

我会以CSV格式编写来自http请求的JSON输出,但出现此错误:

TypeError: the JSON object must be str, bytes or bytearray, not list

这里是我的代码的快照:


my_json = json.loads(resp_obj)

    with open("wiki.txt", "a") as myfile:

            writer = csv.writer(myfile)

            for item in my_json["mainsnak"]["datavalue"]:

                    writer.writerow([item, "https://www.geonames.org/{}".format(item["value"])])  #Write row.

    myfile.close()

我尝试使用this,但仍然出现错误。

这里是从请求中得到的JSON:


[
    {
        "id": "Q6761$59FB3973-0123-4EB4-9C98-F7FEB6AAA32B",
        "mainsnak": {
            "datatype": "external-id",
            "datavalue": {
                "type": "string",
                "value": "6540122"
            },
            "hash": "e7602dcd11d9a83e46716925865bca8e36a9b12c",
            "property": "P1566",
            "snaktype": "value"
        },
        "rank": "normal",
        "references": [
            {
                "hash": "88694a0f4d1486770c269f7db16a1982f74da69d",
                "snaks": {
                    "P248": [
                        {
                            "datatype": "wikibase-item",
                            "datavalue": {
                                "type": "wikibase-entityid",
                                "value": {
                                    "entity-type": "item",
                                    "id": "Q830106",
                                    "numeric-id": 830106
                                }
                            },
                            "hash": "1b3ef912a2bd61e18dd43abd184337eb010b2e96",
                            "property": "P248",
                            "snaktype": "value"
                        }
                    ]
                },
                "snaks-order": [
                    "P248"
                ]
            }
        ],
        "type": "statement"
    }
]

在CSV文件中,我只会解析"value": "6540122"

2 个答案:

答案 0 :(得分:1)

TypeError告诉您问题出在哪里。您正在尝试将列表传递给函数时,它需要字节或字符串。很难说是哪个,因为您没有在错误消息中包含该信息,但这是基于数据结构的最佳猜测:

my_json = json.loads(resp_obj)
with open("wiki.txt", "a") as myfile:
    writer = csv.writer(myfile)
    for item in my_json:
        writer.writerow([item["mainsnak"]["datavalue"], "https://www.geonames.org/{}".format(item["mainsnak"]["datavalue"]["value"])])
myfile.close()

答案 1 :(得分:1)

您的问题不是写到csv文件中,而是首先解码json数据。

根据此问题将您的json数据用作字符串,并将其传递给json.loads()函数:

>>> import json
>>> my_json = json.loads(json_str)
>>>

(没有错误)

但是,如果我们在列表中传递它:

>>> my_json = json.loads([json_str])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.4/json/__init__.py", line 312, in loads
    s.__class__.__name__))
TypeError: the JSON object must be str, not 'list'
>>>

我们得到与您相同的例外。

检查resp_obj对象的结构。我认为您会发现它以列表的形式传递到您的函数中。您将只想传递您感兴趣的列表项,而不是列表本身。