从 URL 获取 CSV headers 的最简单方法

Simplest ways of getting CSV headers from URL

我构建了一个 web-app,用户可以在其中使用 CSV 文件上传联系人。

上传 CSV 文件后,我想将 header 字段映射到应用程序的字段。

我面临的问题是找出一种有效且简单的方法来从 CSV link.

return CSV header 列表

理想情况下,我希望通过 HTTP 请求将列表 return;或者,使用 JavaScript,这样我就可以将它传回应用程序。

例如,这是一个包含飓风计数的 CSV 文件: https://people.sc.fsu.edu/~jburkardt/data/csv/hurricanes.csv

header是:

Month, "Average", "2005", "2006", "2007", "2008", "2009", "2010", "2011", "2012", "2013", "2014", "2015"

我的想法是 运行 AWS Lambda 中的 Python 脚本获取 CSV headers,然后使用 HTTP 请求将它们发送到应用程序。

是否有另一种方法可以完成此操作client-side或者无需设置后端基础结构(如 AWS Lambda)?

有一个从 requests 流式传输的选项,您可以按行处理 CSV。参见:Body Content Workflow

示例:

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)
    break

这只会给你 header。我使用了来自 github 的原始 CSV 文件示例:sample-csv

“简单”的答案显然是下载整个文件并使用它。但是您也许可以节省一些时间。如果该文件接受部分下载,那么您很幸运。要检查:

import requests
requests.head("https://people.sc.fsu.edu/%7Ejburkardt/data/csv/hurricanes.csv").headers

产量

{'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'}

注意 Accept-Ranges: 'bytes'。您可以要求提供文件的特定部分。大奖!

然后是使用 requests 和 header 的问题:

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)

输出:

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'

所以我们有 header,还有几行。

请注意,我打印,但您可以保存到变量、大字符串、写入本地 CSV 文件,...任何适合您需要的内容。另外,我选择了 2048 字节的范围和 1024 字节的块;随机应变!