如何从Web下载多个文件时跳过丢失的文件?

时间:2014-01-15 12:09:54

标签: r try-catch

我对下载文件有疑问。我知道如何使用download.file功能下载文件。我需要从特定站点下载多个文件,每个文件对应一个不同的日期。我有一系列日期,使用它我可以准备URL来下载文件。我知道一个事实,在某些特定日期,网站上缺少这些文件。随后我的代码在那时停止了。然后我必须手动重置日期索引(将其递增1)并重新运行代码。由于我必须下载超过1500个文件,我想知道我是否可以以某种方式捕获“缺少文件”而不是代码停止,它继续在数组中的下一个日期。

以下是日期数组的一部分的输入:

dput(head(fnames,10))
c("20060102.trd", "20060103.trd", "20060104.trd", "20060105.trd", 
"20060106.trd", "20060109.trd", "20060110.trd", "20060112.trd", 
"20060113.trd", "20060116.trd")

此档案有1723个日期。以下是我正在使用的代码:

for (i in 1:length(fnames)){
file <- paste(substr(fnames[i],7,8), substr(fnames[i],5,6), substr(fnames[i],1,4), sep = "")
URL <- paste("http://xxxxx_",file,".zip",sep="")
download.file(URL, paste(file, "zip", sep = "."))
unzip(paste(file, "zip", sep = "."))}

该程序运行正常,直到遇到文件丢失的特定日期,并停止。有没有办法捕获它,并打印丢失的文件名(变量'文件'),然后继续到数组中的下一个日期?

请帮忙。

我很抱歉我没有分享确切的网址。如果难以模拟问题,请告诉我。

* 试图纳入@Paul的建议。

我在一个较小的数据集上工作。

  

dput(testnames)是       c(“20120214.trd”,“20120215.trd”,“20120216.trd”,“20120217.trd”,       “20120221.trd”)

我知道网站上遗漏了与'20120216'日期对应的文件。我改变了我的代码以包含tryCatch函数。下面是:

tryCatch({for (i in 1:length(testnames)){
        file <- paste(substr(testnames[i],7,8), substr(testnames[i],5,6), substr(testnames[i],1,4), sep = "")
        URL <- paste("http://xxxx_",file,".zip",sep="")
        download.file(URL, paste(file, "zip", sep = "."))
        unzip(paste(file, "zip", sep = "."))}
},
error = function(e) {cat(file, '\n')
                     i=i+1},
warning = function(w) {message('cannot unzip')
                       i=i+1}
)

它在前两个日期运行正常,并且正如预期的那样,会为第三个日期引发错误。我面临两个问题:

  1. 当我'排除'warning块时,它会在file块中为我提供缺少的文件名error。但是当我'包含'warning块时,它只发出警告,并以某种方式不执行error块。这是为什么?

  2. 在任何一种情况下,代码在读取“20120216.trd”后停止,并且没有继续下一个文件,这是可取的。增量变量i是否不足以达到此目的?

  3. 请告知。

1 个答案:

答案 0 :(得分:7)

您可以使用tryCatch执行此操作。此功能将尝试您提供的操作,并为您提供处理错误的方法。例如,在您的情况下,错误可能只是导致跳过文件并忽略错误。例如:

skip_with_message = simpleError('Did not work out')
tryCatch(print(bla), error = function(e) skip_with_message)
# <simpleError: Did not work out>

请注意,此处的错误是bla对象不存在。