You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中使用curl或RCurl下载并处理GISAID的JSON.xz格式文件

R函数实现方案

依赖安装

先安装所需依赖包:

install.packages(c("curl", "jsonlite"))

核心函数实现(curl包方案,推荐)

该方案完全匹配你原bash脚本的逻辑,支持自定义参数、下载重试,默认保留xz压缩格式适配你后续读取需求:

download_gisaid <- function(
    gisaid_username,
    gisaid_password,
    gisaid_feed,
    save_dir = "results",
    decompress = FALSE, # 默认不做解压,保留.xz格式
    retry_times = 4 # 与原bash脚本重试次数一致
) {
  # 检查并创建保存目录
  if (!dir.exists(save_dir)) {
    dir.create(save_dir, recursive = TRUE, showWarnings = FALSE)
  }

  # 构造下载链接
  download_url <- sprintf(
    "https://www.epicov.org/epi3/3p/%s/export/provision.json.xz",
    gisaid_feed
  )

  # 配置curl认证与传输参数
  h <- curl::new_handle(
    username = gisaid_username,
    password = gisaid_password,
    failonerror = TRUE
  )
  h <- curl::handle_setopt(h, low_speed_time = 30, low_speed_limit = 1024)

  # 执行下载逻辑
  if (!decompress) {
    # 直接保存xz格式文件
    save_path <- file.path(save_dir, "provision.json.xz")
    for (i in seq_len(retry_times)) {
      tryCatch({
        curl::curl_download(download_url, destfile = save_path, handle = h)
        message("文件下载完成,保存路径:", save_path)
        break
      }, error = function(e) {
        if (i == retry_times) {
          stop("下载重试", retry_times, "次后失败,错误信息:", e$message)
        }
        message("第", i, "次下载失败,2秒后重试...")
        Sys.sleep(2)
      })
    }
    return(invisible(save_path))
  } else {
    # 边下载边解压,输出json文件
    save_path <- file.path(save_dir, "gisaid.json")
    con <- curl::curl(download_url, handle = h)
    on.exit(close(con))
    xz_con <- xzcon(con, open = "rb")
    on.exit(close(xz_con), add = TRUE)
    writeBin(readBin(xz_con, what = "raw", n = 1e8), save_path)
    message("文件下载并解压完成,保存路径:", save_path)
    return(invisible(save_path))
  }
}

使用示例

# 保存为xz格式,适配后续读取需求
download_gisaid(
  gisaid_username = "你的GISAID用户名",
  gisaid_password = "你的GISAID密码",
  gisaid_feed = "你的GISAID feed ID",
  save_dir = "./data/GISAID_json"
)

# 如需直接解压为json文件,添加参数decompress = TRUE即可

后续读取注意事项

你现有读取代码中用gzfile读取xz格式文件是错误的,需要替换为xzfile才能正常读取:

library(jsonlite)
GISAID_json <- jsonlite::stream_in(xzfile("./data/GISAID_json/provision.json.xz"))

RCurl包备选实现

如果你的运行环境仅支持RCurl包,可以使用以下版本:

# 先安装依赖
# install.packages("RCurl")
download_gisaid_rcurl <- function(
    gisaid_username,
    gisaid_password,
    gisaid_feed,
    save_dir = "results",
    decompress = FALSE,
    retry_times = 4
) {
  if (!dir.exists(save_dir)) dir.create(save_dir, recursive = TRUE)
  download_url <- sprintf(
    "https://www.epicov.org/epi3/3p/%s/export/provision.json.xz",
    gisaid_feed
  )
  save_path <- if (decompress) file.path(save_dir, "gisaid.json") else file.path(save_dir, "provision.json.xz")
  
  for (i in seq_len(retry_times)) {
    tryCatch({
      content <- RCurl::getBinaryURL(
        download_url,
        userpwd = paste0(gisaid_username, ":", gisaid_password),
        followlocation = TRUE
      )
      if (decompress) content <- memDecompress(content, type = "xz")
      writeBin(content, save_path)
      message("下载完成,保存路径:", save_path)
      break
    }, error = function(e) {
      if (i == retry_times) stop("重试", retry_times, "次后失败:", e$message)
      message("第", i, "次下载失败,2秒后重试...")
      Sys.sleep(2)
    })
  }
  return(invisible(save_path))
}

内容的提问来源于stack exchange,提问作者Tom Wenseleers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 10:27:03