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)