【问题标题】:Read a single column of a CSV for API Call读取 CSV 的单列以进行 API 调用
【发布时间】:2021-05-02 03:01:28
【问题描述】:

如何在 python 中完成这样的任务?我得到了一个带有一堆参数的 CSV 文件,比如说 "col""para"。那么,我想将 "para" 列中的所有参数循环为一个数组,并取回每个响应数据并写入 CSV 文件?

col para return
a e
b f
c g

喜欢

para = [e,f,g]

有了这个数组之后,我就可以使用它们中的每一个进行 API 查询。例如,http://api.com/query?name=e 将返回像这样的 JSON 响应

{
 "data":[
 {
  "id": 1,
  "name": "e",
  "response":"return e from api" 
 }, {
  "id": 11,
  "name": "second ",
  "response":"return seconde from api" 
 }
]
}

从API调用获取响应数据后,可以将其写入返回列的CSV文件中。

所以最后,我要找的表格会像下面这样

col para return
a e return e from api
b f return f from api
c g return g from api

【问题讨论】:

  • 应该是哪种API?

标签: python json api csv automation


【解决方案1】:

您需要的是 DataFrame 的 apply() 函数。此函数可以对一列的每个元素执行相同的操作。

How to use apply function in pandas

这是您的案例的示例:

import pandas as pd
import requests

data = pd.read_csv("input_file.csv") 
url = "http://api.com/query?name={}"

data['return'] = data['para'].apply(lambda x:requests.get(url.format(x)).text)

data.to_csv("output_file.csv",index=False)

更多流程,可以定义一个函数来替换上面的lambda函数:

import pandas as pd
import requests
import json

def my_process(para):
    url = "http://api.com/query?name={}".format(para)
    try:
        return_json = json.loads(requests.get(url).text)
        response = return_json['data'][0]['response'] # get the first response string
    except:
        response = ""  # set a value for the case that the API call has no correct results
    return response

data = pd.read_csv("input_file.csv") 
data['return'] = data['para'].apply(my_process)

data.to_csv("output_file.csv",index=False)

<ipython-input-29-77b593e201eb> in <module>
     11 
     12 data = pd.read_csv("input.csv")
---> 13 data['return'] = data['para'].apply(my_process)
     14 
     15 data.to_csv("output_file.csv",index=False)

~\Anaconda3\lib\site-packages\pandas\core\series.py in apply(self, func, convert_dtype, args, **kwds)
   3846             else:
   3847                 values = self.astype(object).values
-> 3848                 mapped = lib.map_infer(values, f, convert=convert_dtype)
   3849 
   3850         if len(mapped) and isinstance(mapped[0], Series):

pandas\_libs\lib.pyx in pandas._libs.lib.map_infer()

<ipython-input-29-77b593e201eb> in my_process(para)
      6     url = "http://api.com/query?name={}".format(para)
      7     return_json = json.loads(requests.get(url).text)
----> 8     response = return_json['data'][0]['response '] # get the first response string
      9     return response
     10 

【讨论】:

  • 所以,我不需要循环每一个?
  • 不,你没有。您可以尝试上面的代码
  • 非常好,因为我一直使用 for 循环来做到这一点,没想到它可以做同样的事情。 [ { "id": 1, "name": "e", "response":"return e from api" } ] 如果我只想将“response”字段的字符串返回到 csv 怎么办?
  • 从“response”键中获取字符串值返回到csv中。
  • 可能返回多个相同参数的响应,如何获取第一个响应及其字符串值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 2021-07-08
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
相关资源
最近更新 更多