【问题标题】:How do I write json content to csv file?如何将 json 内容写入 csv 文件?
【发布时间】:2019-04-24 17:25:22
【问题描述】:

我正在使用 api 调用来请求数据,它返回 JSON。我需要将此响应保存到 CSV 文件中。

我能够提取 JSON 响应,但在写入 CSV 时遇到问题。

# import statements
import json         # package to work with json
import requests     # package to make http requests
import csv

# set global variables
group_id = 0000
api_token = 'yyyy'
api_url = 'https://api.samsara.com/v1'

endpoint_url = api_url + '/fleet/drivers'

# query params for the request
my_params = {"access_token": api_token}

# body data to send with the request
my_data = {"groupId": group_id}

# send POST request to endpoint
resp = requests.post(url = endpoint_url, params = my_params, json = my_data)

# pull out the json
array = resp.json()
text = json.dumps(array)

csvFile = open('/tmp/output.csv','w')
csvwriter = csv.writer(csvFile)
count = 0
for line in text:
    if count == 0:
        header = line.keys()
        csvwriter.writerow(header)
        count += 1
    csvwriter.writerow(line.values())
csvFile.close()

当我运行上面的代码时,我得到以下错误:

Traceback(最近一次调用最后一次):文件“get_driver_test4.py”,行 34,在 header = line.keys() AttributeError: 'str' object has no attribute 'keys'

【问题讨论】:

  • JSON 是什么样的?你能分享一个例子吗?
  • 这里是 JSON 的缩写版本...................................... .......{“驱动程序”:[{“id”:134763,“groupId”:0000,“vehicleId”:212014918234742,“currentVehicleId”:212014918234742,“用户名”:“ablah”,“名称”: “Art Blah”},{“id”:134764,“groupId”:0000,“vehicleId”:212014918234709,“currentVehicleId”:212014918234709,“username”:“btodd”,“name”:“Barry Todd”}]}
  • edit您的问题并添加以澄清它。也就是说,如果您可以使用 JSON 并且从不混合元格式,请不要使用 CSV 作为元格式,您只是在自找麻烦。但是,这不是您的问题,因为您从响应中解码 JSON 并将该数据写入 CSV(元格式转换)。关于您的问题,请提取minimal reproducible example,以便每个人都可以重现您的问题。

标签: json python-3.x csv


【解决方案1】:

将您的问题分解为不同的功能,如下所示:

import json
import requests
import csv

def get_data():
    group_id = 0000
    api_token = 'yyyy'
    api_url = 'https://api.samsara.com/v1'
    endpoint_url = api_url + '/fleet/drivers'

    my_params = {"access_token": api_token}
    my_data = {"groupId": group_id}
    resp = requests.post(url = endpoint_url, params = my_params, json = my_data)
    array = resp.json()
    text = json.dumps(array)

    return text


def write_file(filename, text):
    dataset = json.loads(text)
    drivers = dataset['drivers']

    csvFile = open(filename,'w')
    csvwriter = csv.writer(csvFile)

    # write header
    if len(drivers) > 0:
        keys = drivers[0].keys()
        csvwriter.writerow(keys)

    # write data
    for line in drivers:
       csvwriter.writerow(line.values())

    csvFile.close()

text = get_data()
write_file('output.csv', text)

这样,您可以将 write_file 函数与 get_data 函数分开测试。

需要注意的是0000 的GroupID。如果您输入了这样的组 id,您可能会收到 JSON 解析错误。如果您真的想要 4 个字符的数字,请找到一种引用它们的方法,例如 "0000"。如果您只对数字感兴趣,请将0000 替换为0

为了测试你的理论,在 python 文件的底部使用如下内容:

text = '{"drivers": [{"id": 134763, "groupId": "0000", "vehicleId": 212014918234742, "currentVehicleId": 212014918234742, "username": "ablah", "name": "Art Blah"}, {"id": 134764, "groupId": "0000", "vehicleId": 212014918234709, "currentVehicleId": 212014918234709, "username": "btodd", "name": "Barry Todd"}]}'
write_file('output.csv', text)

结果文件

id,groupId,vehicleId,currentVehicleId,username,name
134763,0000,212014918234742,212014918234742,ablah,Art Blah
134764,0000,212014918234709,212014918234709,btodd,Barry Todd

【讨论】:

  • 非常感谢@zedfoxus。您的解决方案非常完美!
【解决方案2】:

好吧,这个怎么样:

# import statements
import json         # package to work with json
import requests     # package to make http requests
import csv
resp = """
{
    "drivers":[
        {
            "id":134763,
            "groupId":1234,
            "vehicleId":212014918234742,
            "currentVehicleId":212014918234742,
            "username":"ablah",
            "name":"Art Blah"
        },
        {
            "id":134764,
            "groupId":1234,
            "vehicleId":212014918234709,
            "currentVehicleId":212014918234709,
            "username":"btodd",
            "name":"Barry Todd"
        }
    ]
}
"""
text = json.loads(resp)
csvFile = open('output.csv','w')
csvwriter = csv.writer(csvFile, delimiter=',')
line = text["drivers"]
csvwriter.writerow(["id","groupId","vehicleId","currentVehicleId","username","name"])
for l in line:
    csvwriter.writerow([l["id"],l["groupId"],l["vehicleId"],l["currentVehicleId"],l["username"],l["name"]])
    
    
csvFile.close()

您可以根据需要调整代码。

输出.csv

id,groupId,vehicleId,currentVehicleId,username,name

134763,1234,212014918234742,212014918234742,ablah,Art Blah

134764,1234,212014918234709,212014918234709,btodd,Barry Todd

顺便说一句……

在您提供的示例 json 中,groupId 0000 在 python 中引发错误,因为它不是有效数字。考虑将 0000 设为字符串“0000”

更多参考资料...

https://docs.python.org/3/library/csv.html

【讨论】:

    猜你喜欢
    • 2016-04-07
    • 2017-09-02
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多