1

I would like to unzip a file with Python using 7zip executable. In Perl this is pretty straightforward:

$zip_exe_path = "C:\\Dropbox\\7-zip\\7z.exe";
$logfile_path = "C:\\Temp\\zipped_file.7z";
system ("$zip_exe_path x $log_file_path -y");

I tried this:

import subprocess
zip_exe_path = "C:\\Dropbox\\7-zip\\7z.exe"
logfile_path = "C:\\Temp\\zipped_file.7z"
subprocess.call(['zip_exe_path','x','logfile_path','-y'])

When I do so I get this error:

FileNotFoundError: [WinError 2] The system cannot find the file specified

Thanks for any help!

sparrow
  • 10,794
  • 12
  • 54
  • 74

4 Answers4

3

Why not use python zip:

import zipfile

with zipfile.ZipFile(logfile_path, 'r') as z:
    z.extractall()

Or using subprocess:

subprocess.call(['zip_exe_path','x','logfile_path','-y'], shell=True)
midori
  • 4,807
  • 5
  • 34
  • 62
3

This work like a charm for me :)

first, install py7zr library:

pip install py7zr

for extracting all files in .7z:

from py7zr import py7zr

with py7zr.SevenZipFile('7z file_location', mode='r') as z:
    z.extractall()

for extracting a single file:

from py7zr import py7zr

with py7zr.SevenZipFile('7z file_location', mode='r') as z:
    z.extract(targets=['rootdir/filename'])
2

The error is that you are passing the strings 'zip_exe_path' and 'logfile_path' instead of the values of those variables.

import subprocess
zip_exe_path = "C:\\Dropbox\\7-zip\\7z.exe"
logfile_path = "C:\\Temp\\zipped_file.7z"
subprocess.call([zip_exe_path, 'x', logfile_path, '-y'])

You can of course pass the command as a single string with shell=True but the shell does not add any value and incurs some overhead (and risk!)

tripleee
  • 175,061
  • 34
  • 275
  • 318
1

Figured it out:

import subprocess

subprocess.Popen(zip_exe+' x '+file+' -o'+output_loc,stdout=subprocess.PIPE)
sparrow
  • 10,794
  • 12
  • 54
  • 74
  • Switching from `call` to `Popen` is not an improvement here. Requiring a shell is also not an improvement. – tripleee Jan 02 '20 at 09:59