如何使用Ruby下载Github Raw CSV文件



我试图获取发布在GitHub上的更新的CSV文件新冠肺炎,但我一直收到一个错误,即它不在那里。这是一个不断更新的文件,所以我想从源代码GitHub获取它
新冠肺炎时间序列是页面上的第三项。

我尝试了原始文件URL、CSV页面URL,GitHub始终"告诉"我"没有这样的文件或目录"。

这是我的代码:

require 'open-uri'
require 'csv'
covids = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Confirmed.csv"
puts File.exist?(covids)
keys = CSV.open(covids, &:readline)

如何引用此文件?我知道我已经登录了,但Ruby应该能够看到这些文件路径。

URL不是一个文件,因此不能用CSV.open打开它,也不能在File.exist?调用中使用它。我看到你已经在代码中包含了open-uri,所以解决这个问题的快速方法是使用open下载文件并将其传递给CSV.open:

keys = CSV.open(open(covids), &:readline)
puts keys

选择的答案有一些问题:

  • OpenURI的open已弃用。而是使用URI.open:

    pry(main)> open(covids)
    (pry):9: warning: calling URI.open via Kernel#open is deprecated, call URI.open directly or use URI#open
    
  • CSV.open在工作时与方法的签名相反,该方法需要文件名,而不是IO对象。可以想象,如果他们修复了这种行为,那么依赖CSV.open继续获取IO对象在未来会中断。

    相反,CSV文档的第一个示例建议:

    csv = CSV.new(string_or_io, **options)
    # Reading: IO object should be open for read
    csv.read # => array of rows
    # or
    csv.each do |row|
    # ...
    end
    ...
    

    foreach是我会使用的each的形式,因为它更适合我的大脑,YMMV:

    CSV.foreach(URI.open(covids)) 
    

    作为起点。下面是一个查看文件中第一条记录的示例:

    require 'open-uri'
    require 'csv'
    covids = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Confirmed.csv"
    CSV.foreach(URI.open(covids)).first
    # => ["Province/State",
    #     "Country/Region",
    #     "Lat",
    #     "Long",
    #     "1/22/20",
    #     "1/23/20",
    #     "1/24/20",
    #     "1/25/20",
    #     "1/26/20",
    #     "1/27/20",
    #     "1/28/20",
    #     "1/29/20",
    #     "1/30/20",
    #     "1/31/20",
    #     "2/1/20",
    #     "2/2/20",
    #     "2/3/20",
    #     "2/4/20",
    #     "2/5/20",
    #     "2/6/20",
    #     "2/7/20",
    #     "2/8/20",
    #     "2/9/20",
    #     "2/10/20",
    #     "2/11/20",
    #     "2/12/20",
    #     "2/13/20",
    #     "2/14/20",
    #     "2/15/20",
    #     "2/16/20",
    #     "2/17/20",
    #     "2/18/20",
    #     "2/19/20",
    #     "2/20/20",
    #     "2/21/20",
    #     "2/22/20",
    #     "2/23/20",
    #     "2/24/20",
    #     "2/25/20",
    #     "2/26/20",
    #     "2/27/20",
    #     "2/28/20",
    #     "2/29/20",
    #     "3/1/20",
    #     "3/2/20",
    #     "3/3/20",
    #     "3/4/20",
    #     "3/5/20",
    #     "3/6/20",
    #     "3/7/20",
    #     "3/8/20",
    #     "3/9/20",
    #     "3/10/20"]
    
  • 虽然OpenURI很方便,但它并不是Ruby HTTP客户端中功能最全面的。我建议使用RubyHTTP客户端列表顶部的内容。

    此外,请仔细编写代码,以免违反您的网络或GitHub以下使用HEAD请求检查文件上次更新时间的最佳实践;不要重复GET(下载(一个没有更新的文件,因为这是不好的网络礼仪。

此时,您已经准备好解析文件,将信息保存到磁盘或将其重新用于其他用途。我建议将它转储到数据库中,以便使用Sequel之类的东西更容易重用,这使得构建和访问SQLite写入基于磁盘的数据库的模式和数据变得很简单,或者PostgreSQL或MySQL用于更全功能的DBMs。

最新更新