【问题标题】:error when reading .txt file from URL in R从 R 中的 URL 读取 .txt 文件时出错
【发布时间】:2016-01-15 10:35:00
【问题描述】:

我在将网络数据读入 R 时遇到了一些问题。

我希望下载的数据存储在here,您可以在此页面上插入站号,然后将其定向到数据集。例如,如果我在框中输入站号 615071800000,我将被重定向到另一个页面,然后我可以在其中选择数据并要求在浏览器中查看 txt 文件。

由于我有大量的站点需要从中获取数据,因此我决定在 R 中编写一个脚本来执行此操作。下面是一个例子:

site_id <- c('615071800000','629065900000','617106090000','617107080000',
             '615071900000','646066100000','646066420010','646067000000')
for (i in 1:length(site_id)){
  web_str <- 'http://data.giss.nasa.gov/tmp/gistemp/STATIONS/tmp_'
  str <- paste(web_str,site_id[i],'_14_0/station.txt', sep = '')

  # read data from web
  dat <- read.table(str, sep = "", header = TRUE,
                    fill = TRUE, na.string = c(999.9,999.90))
}

这些都是有效的站点 ID,提供并用于生成“str”的链接应该会引导我访问数据。但是,当我在此示例集上运行代码时,它失败了。运行这个例子,我得到:

Error in file(file, "rt") : cannot open the connection
In addition: Warning message:
In file(file, "rt") : cannot open: HTTP status was '404 Not Found'

对我来说发生在循环 i == 7

所以,我将 i = 7 的“str”复制到浏览器中

http://data.giss.nasa.gov/tmp/gistemp/STATIONS/tmp_646066420010_14_0/station.txt

但页面是空的,我在页面顶部收到一条消息“未找到”。

但是,如果我返回主页(即此处提供的第一个链接)并在字段中输入站号,它会将我带到数据,然后我将该页面的链接复制到 R:

http://data.giss.nasa.gov/tmp/gistemp/STATIONS/tmp_646066420010_14_0/station.txt

结果与我之前尝试的字符串完全相同。为什么这不起作用?更奇怪的是,如果我现在再次尝试运行代码,R 现在在 i == 8 处返回相同的错误,即它找到了上一个文件但没有找到下一个文件。这里发生了什么?这是网站的问题吗,例如仅当您在第一页上手动搜索电台时才会生成 txt 文件?是否有解决方法,或者是否有人对我如何使这项工作提出建议?或者有人可以验证这也是另一台机器上的问题。

【问题讨论】:

  • 您必须首先在第一个链接提供的字段中输入所有site_id。然后该站点将为所有 site_id 创建临时文件。在这里从 URL 读取不是一个好主意。
  • 那么,如果我有 1000 个站点数据要获取,我将不得不在第一个链接中手动输入 1000 个单独的站点 ID?如果是这样,那效率不是很高。

标签: r url error-handling file-handling


【解决方案1】:

您可以通过使用curlGetHeaders 请求其标头来触发该站点。然后,创建临时文件,您就可以接收数据了。 试试这个:

dat <- lapply(site_id, function(id) {
  web_str <- 'http://data.giss.nasa.gov/tmp/gistemp/STATIONS/tmp_'
  data_str <- paste(web_str,id,'_14_0/station.txt', sep = '')
  header_str <- paste('http://data.giss.nasa.gov/cgi-bin/gistemp/find_station.cgi?dt=1&ds=14&name=', id, sep = '')
  curlGetHeaders(header_str)
  read.table(data_str, sep = "", header = TRUE, fill = TRUE, na.string = c(999.9,999.90))
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 2016-06-02
    相关资源
    最近更新 更多