使用 R 下载压缩数据文件、提取和导入数据

@ EZGraphs 在 Twitter 上写道: “很多在线 CSV 都被压缩了。有没有一种方法可以下载、解压缩存档文件并使用 R 将数据加载到 data.frame?# Rstats #

我今天也在尝试这样做,但最终只是手动下载压缩文件。

我尝试了这样的方法:

fileName <- "http://www.newcl.org/data/zipfiles/a1.zip"
con1 <- unz(fileName, filename="a1.dat", open = "r")

但我觉得我还有很长的路要走。 有什么想法吗?

149107 次浏览

Zip 存档实际上更像是一个包含内容元数据等的“文件系统”。详情请参阅 help(unzip)。所以要完成上面的草图,你需要

  1. 创建 temp.file 名称(例如 tempfile())
  2. 使用 download.file()将文件提取到 temp.file 中
  3. 使用 unz()从 temp.file 中提取目标文件
  4. 通过 unlink()删除临时文件

它在代码中(感谢基本示例,但这更简单)看起来像

temp <- tempfile()
download.file("http://www.newcl.org/data/zipfiles/a1.zip",temp)
data <- read.table(unz(temp, "a1.dat"))
unlink(temp)

压缩(.z)或 gzip (.gz)或 bzip2ed (.bz2)文件是 只有文件,您可以直接从连接读取这些文件。因此,让数据提供者使用它:)

顺便说一句,我试着把 Dirk 的回答翻译成密码:-P

temp <- tempfile()
download.file("http://www.newcl.org/data/zipfiles/a1.zip",temp)
con <- unz(temp, "a1.dat")
data <- matrix(scan(con),ncol=4,byrow=TRUE)
unlink(temp)

我使用的 CRAN 软件包“下载”发现在 http://cran.r-project.org/web/packages/downloader/index.html。更容易。

download(url, dest="dataset.zip", mode="wb")
unzip ("dataset.zip", exdir = "./")

试试这个代码,对我很有用:

unzip(zipfile="<directory and filename>",
exdir="<directory where the content will be extracted>")

例如:

unzip(zipfile="./data/Data.zip",exdir="./data")

对于 Mac (我认为是 Linux) ... ..。

如果 zip 归档文件包含一个文件,那么可以使用 bash 命令 funzipdata.table包中的 fread:

library(data.table)
dt <- fread("curl http://www.newcl.org/data/zipfiles/a1.zip | funzip")

在存档包含多个文件的情况下,可以使用 tar将特定文件解压缩到 stdout:

dt <- fread("curl http://www.newcl.org/data/zipfiles/a1.zip | tar -xf- --to-stdout *a1.dat")

为了使用 data.table 完成此操作,我发现下面的代码可以工作。不幸的是,该链接不再工作,所以我使用了另一个数据集的链接。

library(data.table)
temp <- tempfile()
download.file("https://www.bls.gov/tus/special.requests/atusact_0315.zip", temp)
timeUse <- fread(unzip(temp, files = "atusact_0315.dat"))
rm(temp)

我知道这在单行中是可能的,因为您可以将 bash 脚本传递给 fread,但是我不确定如何下载。压缩文件,解压缩,并将一个文件从该压缩文件传递到 fread

下面的示例适用于无法用 read.table函数读入的文件。此示例读取一个。Xls 文件。

url <-"https://www1.toronto.ca/City_Of_Toronto/Information_Technology/Open_Data/Data_Sets/Assets/Files/fire_stns.zip"


temp <- tempfile()
temp2 <- tempfile()


download.file(url, temp)
unzip(zipfile = temp, exdir = temp2)
data <- read_xls(file.path(temp2, "fire station x_y.xls"))


unlink(c(temp, temp2))

我发现以下步骤对我很有效。这些步骤来自 BTD 的 YouTube 视频 管理 R 区的 Zipfile:

zip.url <- "url_address.zip"


dir <- getwd()


zip.file <- "file_name.zip"


zip.combine <- as.character(paste(dir, zip.file, sep = "/"))


download.file(zip.url, destfile = zip.combine)


unzip(zip.file)

rio()非常适合这种情况——它使用文件名的文件扩展名来确定它是什么类型的文件,因此它可以处理各种各样的文件类型。我还使用了 unzip()来列出 zip 文件中的文件名,因此不需要手动指定文件名。

library(rio)


# create a temporary directory
td <- tempdir()


# create a temporary file
tf <- tempfile(tmpdir=td, fileext=".zip")


# download file from internet into temporary location
download.file("http://download.companieshouse.gov.uk/BasicCompanyData-part1.zip", tf)


# list zip archive
file_names <- unzip(tf, list=TRUE)


# extract files from zip file
unzip(tf, exdir=td, overwrite=TRUE)


# use when zip file has only one file
data <- import(file.path(td, file_names$Name[1]))


# use when zip file has multiple files
data_multiple <- lapply(file_names$Name, function(x) import(file.path(td, x)))


# delete the files and directories
unlink(td)

使用 library(archive)还可以读取存档中的特定 csv 文件,而不必首先解压缩它; 我觉得这样更方便更快捷。

它还支持所有主要的归档格式,比基本的 R untar 或 unz 快得多——它支持 tar、 ZIP、7-ZIP、 RAR、 CAB、 gzip、 bzip2、 press、 lzma、 xz 和 uucoding 文件。

解压缩一切可以使用 archive_extract("http://www.newcl.org/data/zipfiles/a1.zip", dir=XXX)

这个工程在所有的平台和给我优越的性能将是首选。