R语言HTTP场景下Grep应用问题:文件无法下载及file_names为空排查
问题原因分析
list.files()不支持远程FTP/HTTP路径:这个函数仅用于遍历本地文件系统,无法读取NCBI FTP服务器上的文件列表,因此list.files(url)返回空值,后续grep自然无法筛选出有效文件名。- 正则模式使用错误:
pattern是一个包含多个字符串的向量,grep()默认仅使用向量中的第一个模式进行匹配,无法同时匹配所有目标文件编号对应的文件名。
修正后的代码
首先需要安装并加载curl包(用于读取远程FTP目录):
# 安装curl包(首次运行需要) install.packages("curl") library(curl) # 设定FTP地址 url <- "ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/manuscript/xml/" # 生成目标文件编号 file_nums <- sprintf("%02d", 1:3) # 合并正则模式:匹配所有目标编号的文件 pattern <- paste0("^author_manuscript_xml.PMC0(", paste(file_nums, collapse = "|"), ")") # 获取FTP服务器上的文件列表 ftp_files <- curl::list_ftp(url) # 筛选出目标文件名 file_names <- grep(pattern, ftp_files$name, value = TRUE) # 循环下载文件 for (file_name in file_names) { file_url <- paste0(url, file_name) # 使用curl_download更稳定,也可以保留download.file curl::curl_download(file_url, destfile = file_name) }
关键修改说明
- 替换
list.files()为curl::list_ftp():专门用于读取FTP服务器的文件列表,返回的数据框包含文件名等信息。 - 合并正则模式:用
paste(collapse = "|")将多个文件编号合并成一个正则表达式,确保能同时匹配所有目标文件。 - 使用
curl::curl_download()替代download.file():对远程文件下载的兼容性和稳定性更好,尤其是FTP协议场景。
内容的提问来源于stack exchange,提问作者nora job
相关产品推荐
相关产品推荐

