将 API 响应 CSV 解析为列表而不写入文件

Posted

技术标签:

【中文标题】将 API 响应 CSV 解析为列表而不写入文件【英文标题】:Pasrse API Response CSV to List without writing to file 【发布时间】:2015-10-22 14:54:13 【问题描述】:

目标:

直接读取 .csv API 响应 Python 列表

我正在使用人口普查局的 Bulk Geocoder 来获取许多地址的纬度/经度。批量地理编码的documentation 在第 5-6 页。

我希望能够在不先保存文件的情况下将此 csv 读取到列表中。

我的第一次尝试是做以下事情:

得到响应:

    import requests
    import csv

    url = 'http://geocoding.geo.census.gov/geocoder/locations/addressbatch'
    payload = 'benchmark':'Public_AR_Current', 'vintage':'Current_Current', 'returntype':'locations'
    files = 'addressFile':('Addresses.csv',open(tmp_file,'rb'),'text/csv')
    response = requests.post(url,data=payload,files=files)

处理响应(不写入文件):

    reader = csv.reader(response.content)
    tmp_list = list(reader)

    print(tmp_list)

输出是一维列表:

[[unique_id], [input_address], [match/no_match], [exact/non-exact], [output_address], [lat/long], [tiger_line_id], [tiger_line_side], [ ], ... .]

换行符被读取为要放入列表的元素(显示为 [ ])。

但是,如果我执行以下操作:

处理响应(首先写入文件响应):

    with open('out.csv','w') as f:
        f.write(response.content)

    with open('out.csv','rb') as r:
        reader = csv.reader(r)
        tmp_list = list(reader)

    print(tmp_list)

此方法的输出是所需的二维列表列表:

[[unique_id、input_address、match/no_match、exact/non-exact、output_address、lat/long、tiger_line_id、tiger_line_side]、...]

如何直接读取 .csv 对列表的响应?我想避免 I/O 操作,因为我可能一次执行 300 多个批次(这将是 300 多个写入文件/读取文件。

【问题讨论】:

看起来您已经在执行此操作而无需写入文件,响应可能需要在使用 csvreader 之前进行一些清理。你能发布一些原始回复吗? 【参考方案1】:

csv.reader 类接受 的可迭代;如果在传递内容之前按行拆分内容应该可以:

reader = csv.reader(response.content.split('\n'))

【讨论】:

以上是关于将 API 响应 CSV 解析为列表而不写入文件的主要内容,如果未能解决你的问题,请参考以下文章

Jmeter FileWriter类,用于将自定义响应结果写到excel/txt/word/csv

如何将传入数据(NDJ)从一个API传递到CSV格式的另一个API,而不创建文件?

将 Byte[] 解析为文件而不保存它

在 PHP 中将 CSV 写入不带附件的文件

Python:将列表写入 Pandas 中的列

Python:忽略文本文件的注释,该文本文件被解析为字典以写入 CSV [重复]