将API响应CSV压缩到列表而不写入文件

时间:2015-10-22 14:54:14

标签: python csv geocoding

目标:

  • 直接阅读.csv API对Python列表的响应

我正在使用人口普查局的批量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+写入文件/从文件读取。

1 个答案:

答案 0 :(得分:1)

csv.reader类接受可迭代的;如果你在传入内容之前按行分割内容应该可以工作:

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