在R中从文件夹创建zip文件

28

尝试使用 R 从一个文件夹创建 zip 文件。

这里提到了 "Rcompression" 包: Creating zip file from folders

但我没有找到在 Windows 系统上下载这个包的地方。

有什么建议吗?或者其他函数可以创建 zip 文件吗?


你可以从R中调用系统命令。此外,使用?tar会更容易。我不明白为什么需要一个包来完成这个任务。 - rawr
@rawr 这并不是跨平台那么容易。 - jdharrison
哦,你是在非Windows、Unix或Mac平台上工作吗? - rawr
这个链接可能会有所帮助:https://github.com/omegahat/Rcompression。其中包含了针对Windows的特定指令。 - Rich Scriven
1
可能是从文件夹创建zip文件的重复问题。 - Jot eN
6个回答

51

您可以使用utils包中的zip函数轻松创建一个zip文件。假设您有一个目录testDir,并且您希望将该目录内的一个或多个文件压缩为zip文件,

dir('testDir')
# [1] "cats.csv" "test.csv" "txt.txt" 
zip(zipfile = 'testZip', files = 'testDir/test.csv')
# adding: testDir/test.csv (deflated 68%)

压缩文件将保存在当前工作目录中,除非在zipfile参数中指定了不同的路径。我们可以使用此命令查看其与原始未压缩文件的大小关系:

file.info(c('testZip.zip', 'testDir/test.csv'))['size']
#                  size
# testZip.zip       805
# testDir/test.csv 1493

如果没有子文件夹,你可以用以下命令将整个目录的文件压缩成zip文件:

files2zip <- dir('testDir', full.names = TRUE)
zip(zipfile = 'testZip', files = files2zip)
# updating: testDir/test.csv (deflated 68%)
# updating: testDir/cats.csv (deflated 27%)
# updating: testDir/txt.txt (stored 0%)

解压并查看文件,请使用unzip命令。

unzip('testZip.zip', list = TRUE)
#               Name Length                Date
# 1 testDir/test.csv   1493 2014-05-14 20:54:00
# 2 testDir/cats.csv    116 2014-05-14 20:54:00
# 3  testDir/txt.txt     32 2014-05-08 09:37:00

注意: 关于 zip 参数,来自 ?zip

在 Windows 上,默认情况下依赖于 zip 程序(例如 Rtools 中的 zip 程序)在路径中。


你也想压缩子文件夹吗? - Rich Scriven
运行脚本后我找不到压缩文件。 压缩文件在同一个目录下吗? - Jian Zhang
如果您使用了 zip('testZip', ...),则新的 zip 文件将保存在当前工作目录中。您可以通过 list.files() 查看它。 - Rich Scriven
还是不行。这真奇怪。files <- list.files("C:/Users/zjian/Desktop/tst/testDir",full.names = TRUE) files [1] "C:/Users/zjian/Desktop/tst/testDir/file1.pdf" [2] "C:/Users/zjian/Desktop/tst/testDir/file2.r"
[3] "C:/Users/zjian/Desktop/tst/testDir/file3.docx" getwd() [1] "C:/Users/zjian/Desktop/tst" zip(zipfile="newfile",files=files) list.files("C:/Users/zjian/Desktop/tst",full.names = TRUE) [1] "C:/Users/zjian/Desktop/tst/R.rdata" "C:/Users/zjian/Desktop/tst/testDir"'
- Jian Zhang
您可能需要下载 Rtools 软件包。 - Rich Scriven
显示剩余4条评论

7
为了避免相对路径问题(即zip文件本身包含完整的目录结构以压缩的文件夹路径)和for循环(风格),您可以使用:
my_wd<-getwd() # save your current working directory path
dest_path<-"C:/.../folder_with_files_to_be_zipped" 
setwd(dest_path)
files<-list.files(dest_path)
named<-paste0(files,".zip")
mapply(zip,zipfile=named,files=files)
setwd(my_wd) # reset working directory path

与 R 的内置 unzip 函数不同,zip 需要一个像 7-zip (Windows) 或者 Rtools 中的 zip 程序在系统路径中存在。


此代码的目的是...为folder_with_files_to_be_zipped文件夹中的每个文件创建一个zip文件? - bers

6
对于仍在寻找的人:现在有一个“zip”包,不依赖外部可执行文件。 链接

2
值得注意的是,如果找不到zip程序,zip()将会悄无声息地失败。 zip以不可见的方式返回错误代码(或退出代码)。也就是说,除非你明确要求它打印,否则它不会打印任何信息。
你可以运行print(zip(output, input))来打印退出代码。如果没有找到zip程序,它将打印127
另外,你也可以采取类似以下的做法:
#exit code 0 for success, all other codes are for failure
if (exit_code <- zip(output, input) != 0) {
    stop("Zipping ", input, " failed with exit code:", exit_code)
}

1
您可以从omegahat存储库安装:
install.packages('Rcompression', repos = "http://www.omegahat.org/R", type = "source")

对于Windows系统,您需要安装zlib和bzip2并进行适当的链接才能使用。

utils::zip在某些情况下可用。但是它存在一些问题。一个问题是在Windows系统中,您可以在命令提示符中使用的字符串的最大长度为8191个字符(某些版本为2047个字符)。如果您要压缩具有很多字符名称的目录/文件,则会出现问题。例如,如果您压缩Firefox配置文件目录,则会出现问题。此外,我发现必须相对于要压缩的目录发出zip命令以使用相对目录名称。Rcompression具有altNames参数来处理这个问题。 尽管如此,我始终无法在Windows上成功运行Rcompression


0

做那个

    #Convertir todas las carpetas en .zip
    d <- "C:/Users/Eric/Documents/R/win-library/3.3"
    array <- list.files(d)

    for (i in 1:length(array)){
      name <- paste0(array[i],".zip")

      zip(name, files = paste0(d,paste0("/",array[i])))
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接