首页 > 解决方案 > 将行数据从 CSV 传递到 API,并将结果附加到空的 CSV 列

问题描述

我正在尝试用 Python 编写代码,该代码将从CSV文件中获取行并将它们传递给 API 调用。如果返回成功,我想追加到我添加yesmatch列。如果没有返回数据,则no改为追加。

这是当前返回第一行匹配结果的代码:

headers = {
   'Authorization': {token},
   'Content-Type': 'application/json; charset=utf-8',
}

data = '[{
    "name": "Company 1",
    "email_domain": "email1.com",
    "url": "https://www.url1.com"
}]'

response = requests.post(
    'https://{base_url}/api/match',
    headers=headers,
    data=data
)

如果我手动将数据传递给 API 调用,则此代码适用于每一行,但由于有数百行,我希望能够遍历每一行,通过 API 调用传递它们,然后追加yesnomatch我创建的列。我的强项不是编写for循环,我相信这是解决这个问题的方法,但我会喜欢任何做过类似事情的人的意见。

标签: pythoncsv

解决方案


假设您有一个src.csv包含以下内容的文件:

company_id,company_name,url,company_domain,match
1,Company 1,https://www.url1.com,email1.com,
2,Company 2,https://www.url2.com,email2.io,
3,Company 3,https://www.url3.com,email3.com,

以下代码片段将读取它并创建一个新tgt.csv文件,其中match每行的列设置为yesor no,基于结果request.post()(您需要根据您的逻辑对其进行调整):

import csv
import json

token = 'Your API Token Here'
base_url = 'https://some.base.url'
headers = {
   'Authorization': token,
   'Content-Type': 'application/json; charset=utf-8',
}

with open('src.csv') as src, open('tgt.csv', 'w', newline='') as tgt:
    reader = csv.reader(src)
    writer = csv.writer(tgt)

    columns = next(reader)

    writer.writerow(columns)

    for company_id, company_name, url, company_domain, match in reader:
        data = json.dumps([{
            'name': company_name,
            'email_domain': company_domain,
            'url': url
        }])

        response = requests.post(
            f'{base_url}/api/match',
            headers=headers,
            data=data
        )

        if response.ok:
            match = 'yes'
        else:
            match = 'no'

        writer.writerow((company_id, company_name, url, company_domain, match))

推荐阅读