我对下载文件有疑问。我知道如何使用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}
)
它在前两个日期运行正常,并且正如预期的那样,会为第三个日期引发错误。我面临两个问题:
当我'排除'warning
块时,它会在file
块中为我提供缺少的文件名error
。但是当我'包含'warning
块时,它只发出警告,并以某种方式不执行error
块。这是为什么?
在任何一种情况下,代码在读取“20120216.trd”后停止,并且没有继续下一个文件,这是可取的。增量变量i
是否不足以达到此目的?
请告知。
答案 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
对象不存在。