【问题标题】:Download & decompress JSON file in R using curl or RCurl使用 curl 或 RCurl 在 R 中下载和解压缩 JSON 文件
【发布时间】:2021-12-03 03:09:12
【问题描述】:

我有以下 bash 脚本来下载和解压缩 JSON 文件:

#!/bin/sh -ex

# Ensure data directory (or a link) exists.
test -e results || mkdir results

# Download and decompress data.
curl -u $GISAID_USERNAME:$GISAID_PASSWORD --retry 4 \
  https://www.epicov.org/epi3/3p/$GISAID_FEED/export/provision.json.xz \
  | xz -d -T8 > results/gisaid.json

理想情况下,我希望有一个 R 函数来在给定目录中下载和解压缩此文件,并将 $GISAID_USERNAME、$GISAID_PASSWORD 和 $GISAID_FEED 上方的环境变量作为参数传递。有谁知道如何做到这一点,例如使用包curlRCurl? (也可以不解压缩并将其保留为 .json.xz,因为我稍后会使用

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

【问题讨论】:

  • 因为标签也是 R:在我的回答中 (stackoverflow.com/a/66320754/6356278) 是一种使用 Rselenium 将文件下载到特定位置的方法。
  • 有没有公开可用的 json.gz 文件(url)你可以提供,这样我们就可以尝试那个虚拟文件
  • @stevec 无法公开分享,但请发送电子邮件至 tom.wenseleers@kuleuven.be,我可以为您提供更多详细信息...

标签: r json curl rcurl


【解决方案1】:

这样的事情应该可以工作:

library(curl)
library(glue)

custom_curl <- function(user, pass, feed, dest) {
  custom_handle <- curl::new_handle()
  curl::handle_setopt(
    custom_handle,
    username = user,
    password = pass
  )
  
  url <- glue::glue(
    "https://www.epicov.org/epi3/3p/{feed}/export/provision.json.xz"
  )
  
  curl::curl_download(url, dest, handle = custom_handle)
}

custom_curl('my_user', 'xxxxxx', 'feed1', 'dest/filename.json.xz')

由于我无法在真实文件和 url 中进行测试,我不确定是否需要对函数进行少量修改,但至少对您来说是一个起点。

【讨论】:

  • 非常感谢!完美运行 - 甚至不需要修补任何东西!
【解决方案2】:

在 R 中使用 system 函数执行终端命令对您有帮助吗?

将您的终端调用放入system(),它应该会执行并创建您的文件。然后读入文件。当然,您必须将 $GISAID_USERNAME, $GISAID_PASSWORD 替换为您的实际信息。如果登录信息或 url 应该是灵活的,你可以预先组合一个字符串,因为system() 需要一个字符串来执行命令。

system("curl -u $GISAID_USERNAME:$GISAID_PASSWORD --retry 4 \
https://www.epicov.org/epi3/3p/$GISAID_FEED/export/provision.json.xz \
| xz -d -T8 > results/gisaid.json")

然后只需读取(希望)创建的文件。

无法使用您的设置进行测试,但对我来说,例如这个小例子成功创建了一个文件:

system("curl https://raw.githubusercontent.com/SteffenMoritz/imputeTS/master/pkgdown/favicon/favicon.ico > /Users/Steve/Downloads/x.ico")

【讨论】:

  • 是的已经想到了,但这是否可行在很大程度上取决于一个人的计算机设置和操作系统等。最后,我使用 curl 使用下面的纯 R 解决方案,它完美地工作......不过还是谢谢!
猜你喜欢
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多