【问题标题】:Simplest ways of getting CSV headers from URL从 URL 获取 CSV 标头的最简单方法
【发布时间】:2022-01-26 11:21:44
【问题描述】:

我已经构建了一个网络应用程序,用户可以在其中使用 CSV 文件上传联系人。

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

我面临的问题是找出一种有效且简单的方法来从 CSV 链接返回 CSV 标头列表。

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

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

标题是:

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

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

是否有另一种方法可以在客户端完成这项工作,或者无需设置像 AWS Lambda 这样的后端基础架构?

【问题讨论】:

    标签: javascript python csv aws-lambda httprequest


    【解决方案1】:

    有一个从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
    

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

    【讨论】:

    • 我最终使用这个脚本创建了一个 AWS Lambda 函数。该函数通过提供 .csv URL 作为参数的 cURL GET 请求调用。多亏了“stream=True”解决方案,该函数只需不到一秒的时间就可以返回列。感谢您的帮助。
    • @RobbyFrank 不客气!我很高兴能帮上忙。
    【解决方案2】:

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

    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 和标题的问题:

    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'
    

    所以我们有了标题,还有几行。

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

    【讨论】:

      猜你喜欢
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      • 2012-05-16
      • 2011-05-17
      • 1970-01-01
      相关资源
      最近更新 更多