【问题标题】:Pass row data from CSV to API and append results to an empty CSV column将行数据从 CSV 传递到 API,并将结果附加到空的 CSV 列
【发布时间】:2023-03-31 09:01:01
【问题描述】:

我正在尝试用 Python 编写代码,该代码将从 CSV 文件中获取行并将它们传递给 API 调用。如果返回成功,我想将yes 附加到我添加的match 列中。如果没有返回数据,则追加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 调用传递它们,并将yesno 附加到我创建的match 列。我的强项不是写for 循环,我相信这是解决这个问题的方法,但我希望有做过类似事情的人提供任何意见。

【问题讨论】:

标签: python csv


【解决方案1】:

由于您想要遍历您的 csv 文件,因此您必须使用 for 循环。 csv.DictReader 可以转换字典列表中的 csv 文件,这正是您所需要的:

import csv
with open('filename.csv', newline='') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        data = str([row])

您也可以使用pandas.DataFrame.to_json(orient="index")

【讨论】:

    【解决方案2】:

    假设您有一个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,
    

    下面的代码 sn -p 将读取它并创建一个新的tgt.csv 文件,其中每行的列match 设置为yesno,基于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))
    

    【讨论】:

    • 非常感谢!这非常有效。感谢您的快速帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 2021-05-08
    • 2019-03-01
    • 2015-06-30
    • 1970-01-01
    • 2018-06-18
    相关资源
    最近更新 更多