在R中解压缩受密码保护的zip文件

时间:2016-06-06 19:30:31

标签: r windows unzip password-encryption

无法在unziputils)功能中指定密码。我所知道的另一个函数getZipHmisc)仅适用于包含一个压缩文件的zip文件。

我想做这样的事情来解压缩Windows 8中foo.zip中的所有文件:

unzip("foo.zip", password = "mypass")

4 个答案:

答案 0 :(得分:2)

我发现这个问题非常有用,但看到没有发布正式答案,所以这里有:

  1. 首先我安装了7z。
  2. 然后我添加了" C:\ Program Files \ 7-Zip \"到我的环境路径。
  3. 我测试了从命令行识别出7z命令。
  4. 我打开了R并使用相应的system("7z x secure.7z -pPASSWORD")输入PASSWORD
  5. 我有多个压缩文件,而不是源代码中的密码显示或存储在任何文本文件中,所以我编写了以下脚本:

    file_list <- list.files(path = ".", pattern = ".7z", all.files = T)
    pw = readline(prompt = "Enter the password: ")
    for (file in file_list) {
      sys_command = paste0("7z ", "x ", file, " -p", pw)
      system(sys_command)
    }
    

    当sourced将提示我输入密码,zip文件将循环解压缩。

答案 1 :(得分:1)

我发现@Kim的答案最终对我有用,但不是一开始。我以为我只会添加一些额外的链接/步骤来最终帮助我实现目标。

关闭并重新打开R,以便识别环境路径

如果在执行步骤1-3时已经打开了R,则需要关闭并重新加载R以使R识别7z的环境路径。 @ wush978对这个问题r system doesn't work when trying 7zip的回答提供了很多信息。我使用Sys.getenv(“ PATH”)来检查环境路径中是否包含7zip。

步骤4。我打开R并使用适当的密码键入system(“ 7z x secure.7z -pPASSWORD”)。

我实际上发现这行不通,因此我按照本文中的说明进行了一些修改,该说明还说明了如何指定输出目录https://stackoverflow.com/a/16098709/13678913

如果已经解压缩了文件,则系统命令会提示您选择是否要使用存档中的文件替换现有文件,并提供选项 (Y)es /(N)o /(A)永远/(S)全部跳过/ A(u)重命名所有/(Q)uit?

因此,修改后的第4步(是,允许替换文件)

system("7z e -ooutput_dir secure.zip -pPASSWORD" Y)

将其全部作为一组经过修改的说明

  1. 安装7z。
  2. 使用菜单选项(此处的说明https://www.opentechguides.com/how-to/article/windows-10/113/windows-10-set-path.html)将“ C:\ Program Files \ 7-Zip \”添加到我的环境路径中
  3. 关闭并重新打开R Studio。输入Sys.getenv("PATH")来检查环境中识别的7zip的路径(按照@ wush978对问题r system doesn't work when trying 7zip的回答)
  4. 在控制台system("7z e -oC:/My Documents/output_dir secure.zip -pPASSWORD")中输入适当的密码(按照https://stackoverflow.com/a/16098709/13678913的说明)

这是@Kim简洁函数的修改版本(包括指定的输出目录并检查现有文件):

我的主脚本

output_dir <- "C:/My Documents/output_dir " #space after directory name is important
zippedfiles_dir <- "C:/My Documents/zippedfiles_dir/"

file_list <- paste0(output_dir , zippedfiles_dir , list.files(path = zippedfiles_dir, pattern = ".zip", all.files = T))

source("unzip7z.R")

源文件unzip7z.R内部的代码

pw = readline(prompt = "Enter the password: ")
for (file in file_list) {
  csvfile <- gsub("\\.zip", "\\.csv", gsub(".*? ", "", file)) #csvfile name (removes output_dir from 'file' and replaces .zip extension with .csv)

#check if csvfile already exists in output_dir, and if it does, replace it with archived version and if it doesn't exist, continue to extract.
  if(file.exists(csvfile)) { 
     sys_command = paste0("7z ", "e -o", file, " -p", pw, " Y")
  } else {
     sys_command = paste0("7z ", "e -o", file, " -p", pw)
  } 
  system(sys_command)
}

答案 2 :(得分:0)

密码<-“您的密码”

system(command = paste0(“ unzip -o -P”,password,“”,“ yourfile.zip”),        等待= TRUE )

答案 3 :(得分:0)

密码←“您的密码”

read.table(text=system(paste0("unzip -p -P ", password, " yourfile.zip ", "yourfile.csv"),intern = "TRUE"),stringsAsFactors=FALSE,header=TRUE,sep=",")