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

5

unzip (utils)函数中不能指定密码。我知道的另一个函数getZip (Hmisc)只适用于包含一个压缩文件的zip文件。

我想在Windows 8中执行以下操作,解压foo.zip中的所有文件:

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

或许可以尝试使用system("7z x secure.7z")命令?参考链接:https://dev59.com/YF4c5IYBdhLWcg3wOoK6#28160425 - zx8754
谢谢,我还没有成功,但是我认为你的建议指引了我正确的方向(依赖于7z语法)。 - InspectorSands
请在您的帖子中更新尝试和问题,如果您已经解决了问题,可以在下面添加您自己的答案。 - zx8754
4个回答

6

我发现这个问题非常有用,但是没有正式的答案发布,所以我来回答一下:

  1. 首先我安装了7z。
  2. 然后我将"C:\Program Files\7-Zip"添加到我的环境路径中。
  3. 我测试了命令行是否能够识别7z命令。
  4. 我打开了R并输入了system("7z x secure.7z -pPASSWORD"),其中包括适当的PASSWORD

我有多个压缩文件,我不想在源代码中显示密码或将其存储在任何文本文件中,因此我编写了以下脚本:

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)
}

当我获取资源时,会提示我输入密码,然后压缩文件将在循环中被解压缩。

2
运行得很好,感谢您跟进!为了完成,请使用setx PATH"%PATH%;C:\Program Files\7-Zip\"将7z添加到您的环境变量中。 - InspectorSands

3

我发现@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"),其中PASSWORD是适当的密码。

实际上我发现这个方法没有起作用,所以我按照该帖子中的说明稍微修改了一下,该帖子还解释了如何指定输出目录:https://dev59.com/s2Qo5IYBdhLWcg3wZehg#16098709

如果您已经提取了文件,则系统命令会提示您选择是否要用存档中的文件替换现有文件,并提供选项(Y)es / (N)o / (A)lways / (S)kip all / A(u)to rename all / (Q)uit?

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

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

将所有内容整合成一组修改后的指令:

  1. 安装7z。
  2. 使用菜单选项将“C:\Program Files\7-Zip\”添加到我的环境路径中(按照此处的说明进行操作 https://www.opentechguides.com/how-to/article/windows-10/113/windows-10-set-path.html)。
  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"),其中PASSWORD为实际的密码(按照此处的说明进行操作 https://dev59.com/s2Qo5IYBdhLWcg3wZehg#16098709)。

以下是修改后的@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)
}

0
password <- "your password"
system(
  command = paste0("unzip -o -P ", password, " ", "yourfile.zip"), 
  wait = TRUE
)

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

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