【问题标题】:Converting responses returned from REST API into CSV将从 REST API 返回的响应转换为 CSV
【发布时间】:2018-10-12 12:12:14
【问题描述】:

我正在尝试将从 REST API 返回的响应写入 csv 文件。由于有多个请求,我对请求一一调用 API。因此,会有多个响应。我无法实现所需的格式。

所需格式:

name,job,id,createdAt
morpheus,leader,727,2018-10-12T12:04:39.234Z
Mark,SSE,925,2018-10-12T12:04:40.200Z
Taylor,SE,247,2018-10-12T12:04:41.115Z

代码:

import requests

url ='https://reqres.in/api/users'
data =[{
    "name": "morpheus",
    "job": "leader"
},
    {"name":"Mark",
    "job":"SSE"},

    {"name":"Taylor",
    "job":"SE"}
]

with open('response.csv','w') as f:
    for element in data:
        r=requests.post(url,json=element)
        response = json.loads(r.text)
        for key in response.keys():
            #f.write("%s,%s"%(key,response[key]))

【问题讨论】:

  • 你在写 csv:先写出响应的标题,一次,然后写出不带标题的数据。
  • 如果你可以导入外部包,pandas 有一个很好的 from_records 构造函数,它将从 json 记录创建一个表,然后是一个很好的 to_csv 方法来写出一个 csv 文件。如果你的 json 数据每次都被严格格式化,这将需要两行代码来编写。

标签: python json csv


【解决方案1】:

Python 带来了对 csv 读取和写入的内置支持,允许您使用不同的分隔符和转义逻辑定义方言。

需要对包含分隔符或换行符或转义字符的单元格值进行转义,否则生成的 csv 已损坏 - csv 模块会为您执行此操作。您可以在不同的格式之间进行选择(加载 csv 时 Excel 可能会很挑剔),或者定义您自己的格式。

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

【讨论】:

    【解决方案2】:

    假设您从服务器获取的数据具有您正在寻找的确切密钥,这样的事情应该可以工作:

    data = [] # Your data here.
    url = 'https://reqres.in/api/users'
    
    desired_columns = ['name', 'job', 'id', 'createdAt']
    with open('response.csv', 'w') as f:
    
        # First we need to write the column names to the file
        f.write(','.join(desired_columns) + '\n')
    
        for element in data:
            r = requests.post(url, json=element)
    
            response = json.loads(r.text)
    
            # Here, I will assume response has 'name', 'job', 'id' and 'createdAt'
            # as keys to the dictionary. We will save them to the list 'data_to_write'
            # And then write that out the same way we did above.
            data_to_write = []
            for column in desired_columns:
                data_to_write.append(response[column])
    
            f.write(','.join(data_to_write) + '\n')
    

    【讨论】:

    • 感谢您的回复。我添加了 +"\n" 来分割标题和记录中的行。
    • 如果值包含您选择的分隔符,如何转义?这会破坏你的 csv。使用内置的 python csv writer。
    猜你喜欢
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多