在R中从FTP批量下载HDF文件:按链接命名及批量下载目录文件
解决方案:批量下载FTP服务器上的HDF文件
一、从指定URL列表批量下载并保留原文件名
针对已有明确HDF文件URL列表的场景,可通过循环自动提取文件名并完成批量下载:
# 定义待下载的FTP URL列表 ftp_urls <- c( "ftp://username:password@ftppath/File#1_hh_mm_ss.HDF", "ftp://username:password@ftppath/File#2_hh_mm_ss.HDF", "ftp://username:password@ftppath/File#3_hh_mm_ss.HDF" ) # 循环遍历URL,自动提取文件名并下载 for (url in ftp_urls) { # 从URL中提取原始文件名 dest_file <- basename(url) # 下载二进制格式的HDF文件,需指定mode="wb"避免文件损坏 download.file(url, destfile = dest_file, mode = "wb") cat("已完成下载:", dest_file, "\n") }
如果偏好tidyverse风格的简洁写法,可使用purrr包:
library(purrr) walk(ftp_urls, ~{ dest_file <- basename(.x) download.file(.x, destfile = dest_file, mode = "wb") cat("已完成下载:", dest_file, "\n") })
二、按不同FTP账号下载对应目录下所有HDF文件
针对多账号、需批量抓取目录内所有HDF文件的场景,推荐使用RCurl包实现更灵活的FTP操作:
# 安装RCurl(首次使用时执行) # install.packages("RCurl") library(RCurl) # 定义多组FTP服务器配置(用户名、密码、目标目录) ftp_servers <- list( list( user = "username1", pass = "password1", dir = "ftp://ftppath/" # 目录URL末尾需加/ ), list( user = "username2", pass = "password2", dir = "ftp://ftppath/" ) ) # 遍历每组FTP配置,批量下载目录内所有HDF文件 for (server in ftp_servers) { # 设置FTP连接选项 ftp_opts <- curlOptions( userpwd = paste0(server$user, ":", server$pass), ftp.use.epsv = FALSE # 适配部分不支持EPSV模式的FTP服务器 ) # 获取目标目录下的所有文件名列表 file_list_str <- getURL( server$dir, .opts = ftp_opts, ftplistonly = TRUE # 仅获取文件名,不返回文件内容 ) # 拆分字符串得到单个文件名,并筛选出.HDF后缀的文件 file_names <- strsplit(file_list_str, "\n")[[1]] hdf_files <- grep("\\.HDF$", file_names, value = TRUE) # 批量下载筛选后的HDF文件 for (file in hdf_files) { full_url <- paste0(server$dir, file) download.file( full_url, destfile = file, mode = "wb", extra = paste0("--user ", server$user, ":", server$pass) ) cat("已完成下载:", file, "(账号:", server$user, ")\n") } }
关键注意事项
- HDF为二进制文件,下载时必须指定
mode="wb",否则文件可能损坏 - 若URL包含
#等特殊字符出现下载失败,可先用URLencode(url)对URL编码后再使用 - 若遇到FTP连接超时,可在
curlOptions中添加connecttimeout=30延长超时时间
内容的提问来源于stack exchange,提问作者S_Av
相关产品推荐
相关产品推荐

