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

Shi*_*vam 2 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")
Run Code Online (Sandbox Code Playgroud)

这个文件有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 = "."))}
Run Code Online (Sandbox Code Playgroud)

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

请帮忙.

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

*试图纳入@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}
)
Run Code Online (Sandbox Code Playgroud)

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

  1. 当我"排除"的warning块,它给了我丢失的文件名file作为编码的error块.但是当我'包含' warning块时,它只发出警告,并以某种方式不执行error块.这是为什么?

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

请指教.

Pau*_*tra 7

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

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

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