Creé una aplicación web donde los usuarios pueden cargar contactos usando archivos CSV.
Una vez que se cargue el archivo CSV, me gustaría asignar los campos del encabezado a los campos de la aplicación.
El problema al que me enfrento es encontrar una manera simple y eficiente de devolver una lista de encabezados CSV desde un enlace CSV.
Idealmente, me gustaría que la lista regrese a través de una solicitud HTTP; o alternativamente, usando JavaScript, para que pueda devolverlo a la aplicación.
Por ejemplo, aquí hay un archivo CSV que contiene recuentos de huracanes: https://people.sc.fsu.edu/~jburkardt/data/csv/hurricanes.csv
Los encabezados son:
Month, "Average", "2005", "2006", "2007", "2008", "2009", "2010", "2011", "2012", "2013", "2014", "2015"Mi idea es ejecutar un script de Python en AWS Lambda que obtenga los encabezados CSV y luego los envíe a la aplicación mediante una solicitud HTTP.
¿Hay otra forma de hacer esto del lado del cliente o sin tener que configurar una infraestructura de back-end como AWS Lambda?
Hay una opción para transmitir desde requests y puede procesar CSV por línea. Ver: Flujo de trabajo de contenido del cuerpo
Ejemplo:
import requests url = "https://raw.githubusercontent.com/codeforamerica/ohana-api/master/data/sample-csv/addresses.csv" r = requests.get(url, stream=True) for line in r.iter_lines(): header = line.decode("utf-8").split(",") print(header) breakEsto le dará sólo el encabezado. He usado un ejemplo de archivo CSV sin procesar de github: sample-csv
La respuesta "simple" es obviamente descargar el archivo completo y trabajar con eso. Pero es posible que pueda ahorrar algo de tiempo. Si el archivo acepta descargas parciales, estás de suerte. Para comprobar que:
import requests requests.head("https://people.sc.fsu.edu/%7Ejburkardt/data/csv/hurricanes.csv").headersrendimientos
{'Date': 'Mon, 27 Dec 2021 14:00:21 GMT', 'Server': 'Apache/2.4.46 (Fedora) OpenSSL/1.1.1g', 'Last-Modified': 'Mon, 27 Jun 2016 12:37:53 GMT', 'ETag': '"1f6-53641c9fb0a40"', 'Accept-Ranges': 'bytes', 'Content-Length': '502', 'X-Frame-Options': 'SAMEORIGIN', 'Keep-Alive': 'timeout=5, max=100', 'Connection': 'Keep-Alive', 'Content-Type': 'text/csv'} Tenga en cuenta los Accept-Ranges: 'bytes' . Puede solicitar partes específicas del archivo. ¡Bote!
Entonces es cuestión de trabajar con las requests y los encabezados:
resume_headers = {'Range':'bytes=0-2048'} r = requests.get(url, stream=True, headers=resume_headers) for chunk in r.iter_content(chunk_size=1024): print(chunk)Producción:
b'"Month", "Average", "2005", "2006", "2007", "2008", "2009", "2010", "2011", "2012", "2013", "2014", "2015"\n"May", 0.1, 0, 0, 1, 1, 0, 0, 0, 2, 0, 0, 0 \n"Jun", 0.5, 2, 1, 1, 0, 0, 1, 1, 2, 2, 0, 1\n"Jul", 0.7, 5, 1, 1, 2, 0, 1, 3, 0, 2, 2, 1\n"Aug", 2.3, 6, 3, 2, 4, 4, 4, 7, 8, 2, 2, 3\n"Sep", 3.5, 6, 4, 7, 4, 2, 8, 5, 2, 5, 2, 5\n"Oct", 2.0, 8, 0, 1, 3, 2, 5, 1, 5, 2, 3, 0\n"Nov", 0.5, 3, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1\n"Dec", 0.0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1\n\n'Entonces tenemos nuestro encabezado, así como un par de líneas más.
Tenga en cuenta que imprimo, pero puede guardar en una variable, una cadena grande, escribir en un archivo CSV local,... lo que se adapte a sus necesidades. Además, seleccioné un rango de 2048 bytes y fragmentos de 1024 bytes; adaptarse a la situación!