我试图获取发布在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。