从 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 字节的块;随机应变!
我构建了一个 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 字节的块;随机应变!