【问题标题】:Unzip a raw file within memory in R在 R 中解压缩内存中的原始文件
【发布时间】:2015-11-16 13:46:31
【问题描述】:

我需要从互联网上下载一个压缩的 csv 文件,解压缩并作为 data.frame 加载到内存中。有没有一种方法可以只在内存中完成整个过程而无需读/写磁盘?这是我尝试过的:

library(RCurl)
file <- getURL(url, userpwd='user:pwd')
tf <- tempfile()
writeBin(content(file, "raw"), tf)
tf <- unzip(tf, exdir=tempdir())
data <- read.csv(tf)
unlink(tf)

我认为writeBinunzipread.csv 这里使用昂贵的磁盘 I/O,但我不知道如何改进。

【问题讨论】:

  • 我会很惊讶写入和解压缩文件的延迟比初始下载慢?但你可以试试unz() 函数。
  • @ForrestR.Stevens,你能解释一下你是如何使用unz函数来完成这个任务的吗?这对我来说不是微不足道的。
  • 为此使用 vroom。 vroom.r-lib.org/index.html

标签: r zip


【解决方案1】:

我认为这个使用 unz() 的示例通过打开与 Zip 存档中单个文件的连接可以让你更接近某个地方,但如果 unz() 函数实际上没有解压缩到磁盘,我会感到惊讶,我没有检查它:

##  Create a sample data.frame object:
d <- data.frame(a=rnorm(40), b=rnorm(40))

##  Write this data.frame to two separate CSV files, and zip
##    them together into a new archive:
write.csv(d, file="d.csv")
write.csv(d, file="d_2.csv")
zip("d.zip", c("d.csv", "d_2.csv"))

##  In this case, we will open a file connection to a single file 
##    inside the zip archive, and read the data in using read.csv():
f <- unz("d.zip", "d_2.csv")
a <- read.csv( f )
head(a)

【讨论】:

  • 在我的 Win 7 系统上zip 函数给出Warning message: running command '"zip" -r9X "d.zip" "d.csv" "d_2.csv" ' had status 127,然后unz 无法打开连接。这是一个可重现的错误吗?
  • 好吧,您不能安装系统 PATH 中可用的 Zip 应用程序...您可以安装 Rtools 并确保 Rtools/bin 在您的 PATH 中(您可以检查运行以下,shell("PATH")) 或者只是在您自己的 Zip 文件上测试该函数,而不是使用我的脚本创建它?
  • 我试过了,似乎 unz 不会解压缩到磁盘,但我仍然不能让它从 url 而不是本地 zip 文件中提取数据,特别是在我使用用户名和密码的情况下,它们都是有 '@' 会混淆 url 解析器。
  • 当然要先下载文件?您无法从非本地文件中解压缩某些内容?
  • 是的,我可以使用getURL 下载文件,它直接下载到内存中,我想知道如何在我的示例中解压缩file 变量并将其解析为data.frame 而无需将其作为本地文件写入磁盘。 unz 似乎只适用于本地文件,而不适用于内存中的原始二进制文件。
猜你喜欢
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
相关资源
最近更新 更多