python csv python-requests

Utilice las solicitudes de Python para descargar CSV



python-requests (5)

Aquí está mi código:

import csv import requests with requests.Session() as s: s.post(url, data=payload) download = s.get(''url that directly download a csv report'')

Esto me da acceso al archivo csv. Intenté con un método diferente para lidiar con la descarga:

Esto dará el archivo csv en una cadena:

print download.content

Imprime la primera fila y devuelve el error: _csv.Error: carácter de nueva línea visto en el campo sin comillas

cr = csv.reader(download, dialect=csv.excel_tab) for row in cr: print row

Esto imprimirá una letra en cada fila y no imprimirá todo:

cr = csv.reader(download.content, dialect=csv.excel_tab) for row in cr: print row

Mi pregunta es cuál es la forma más eficiente de leer un archivo csv en esta situación. Y cómo descargar el archivo csv real.

Gracias


A partir de una pequeña búsqueda, entiendo que el archivo debe abrirse en modo de nueva línea universal, lo que no se puede hacer directamente con un contenido de respuesta (supongo).

Para finalizar la tarea, puede guardar el contenido descargado en un archivo temporal o procesarlo en la memoria.

Guardar como archivo:

import requests import csv import os temp_file_name = ''temp_csv.csv'' url = ''http://url.to/file.csv'' download = requests.get(url) with open(temp_file_name, ''w'') as temp_file: temp_file.writelines(download.content) with open(temp_file_name, ''rU'') as temp_file: csv_reader = csv.reader(temp_file, dialect=csv.excel_tab) for line in csv_reader: print line # delete the temp file after process os.remove(temp_file_name)

En memoria:

(Para actualizarse)


Esto debería ayudar:

import csv import requests CSV_URL = ''http://samplecsvs.s3.amazonaws.com/Sacramentorealestatetransactions.csv'' with requests.Session() as s: download = s.get(CSV_URL) decoded_content = download.content.decode(''utf-8'') cr = csv.reader(decoded_content.splitlines(), delimiter='','') my_list = list(cr) for row in my_list: print(row)

Muestra de Ouput:

[''street'', ''city'', ''zip'', ''state'', ''beds'', ''baths'', ''sq__ft'', ''type'', ''sale_date'', ''price'', ''latitude'', ''longitude''] [''3526 HIGH ST'', ''SACRAMENTO'', ''95838'', ''CA'', ''2'', ''1'', ''836'', ''Residential'', ''Wed May 21 00:00:00 EDT 2008'', ''59222'', ''38.631913'', ''-121.434879''] [''51 OMAHA CT'', ''SACRAMENTO'', ''95823'', ''CA'', ''3'', ''1'', ''1167'', ''Residential'', ''Wed May 21 00:00:00 EDT 2008'', ''68212'', ''38.478902'', ''-121.431028''] [''2796 BRANCH ST'', ''SACRAMENTO'', ''95815'', ''CA'', ''2'', ''1'', ''796'', ''Residential'', ''Wed May 21 00:00:00 EDT 2008'', ''68880'', ''38.618305'', ''-121.443839''] [''2805 JANETTE WAY'', ''SACRAMENTO'', ''95815'', ''CA'', ''2'', ''1'', ''852'', ''Residential'', ''Wed May 21 00:00:00 EDT 2008'', ''69307'', ''38.616835'', ''-121.439146''] [...]

Pregunta relacionada con la respuesta: https://.com/a/33079644/295246

Editar: Otras respuestas son útiles si necesita descargar archivos de gran tamaño (es decir, stream=True ).


Para simplificar estas respuestas y aumentar el rendimiento al descargar un archivo grande, lo siguiente puede funcionar de manera un poco más eficiente.

import requests from contextlib import closing import csv url = "http://download-and-process-csv-efficiently/python.csv" with closing(requests.get(url, stream=True)) as r: reader = csv.reader(r.iter_lines(), delimiter='','', quotechar=''"'') for row in reader: print row

Al establecer stream=True en la solicitud GET, cuando pasamos r.iter_lines() a csv.reader (), estamos pasando un generador a csv.reader (). Al hacerlo, habilitamos csv.reader () para iterar perezosamente sobre cada línea en la respuesta con for row in reader .

Esto evita cargar todo el archivo en la memoria antes de que comencemos a procesarlo, reduciendo drásticamente la sobrecarga de memoria para archivos grandes .


Puede actualizar la respuesta aceptada con el método de solicitudes iter_lines si el archivo es muy grande

import csv import requests CSV_URL = ''http://samplecsvs.s3.amazonaws.com/Sacramentorealestatetransactions.csv'' with requests.Session() as s: download = s.get(CSV_URL) line_iterator = (x.decode(''utf-8'') for x in download.iter_lines(decode_unicode=True)) cr = csv.reader(line_iterator, delimiter='','') my_list = list(cr) for row in my_list: print(row)


También puede usar DictReader para DictReader diccionarios de {''columnname'': ''value'', ...}

import csv import requests response = requests.get(''http://example.test/foo.csv'') reader = csv.DictReader(response.iter_lines()) for record in reader: print(record)