Use Python's zipfile, if available (#24556)
* Style fixes * Use Python's zipfile, if available The compression libs are optional in Python. Rely on python as a first attempt then fall back to `unzip`
This commit is contained in:
parent
f8782c46d7
commit
4a73bfc3b9
1 changed files with 21 additions and 3 deletions
|
@ -39,13 +39,31 @@ def _gunzip(archive_file):
|
||||||
f_out.write(f_in.read())
|
f_out.write(f_in.read())
|
||||||
|
|
||||||
|
|
||||||
|
def _unzip(archive_file):
|
||||||
|
"""Try to use Python's zipfile, but extract in the current working
|
||||||
|
directory instead of in-place.
|
||||||
|
|
||||||
|
If unavailable, try unzip
|
||||||
|
|
||||||
|
Args:
|
||||||
|
archive_file (str): absolute path of the file to be decompressed
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
from zipfile import ZipFile
|
||||||
|
destination_abspath = os.getcwd()
|
||||||
|
with ZipFile(archive_file, 'r') as zf:
|
||||||
|
zf.extractall(destination_abspath)
|
||||||
|
except ImportError:
|
||||||
|
unzip = which('unzip', required=True)
|
||||||
|
unzip.add_default_arg('-q')
|
||||||
|
return unzip
|
||||||
|
|
||||||
|
|
||||||
def decompressor_for(path, extension=None):
|
def decompressor_for(path, extension=None):
|
||||||
"""Get the appropriate decompressor for a path."""
|
"""Get the appropriate decompressor for a path."""
|
||||||
if ((extension and re.match(r'\.?zip$', extension)) or
|
if ((extension and re.match(r'\.?zip$', extension)) or
|
||||||
path.endswith('.zip')):
|
path.endswith('.zip')):
|
||||||
unzip = which('unzip', required=True)
|
return _unzip
|
||||||
unzip.add_default_arg('-q')
|
|
||||||
return unzip
|
|
||||||
if extension and re.match(r'gz', extension):
|
if extension and re.match(r'gz', extension):
|
||||||
return _gunzip
|
return _gunzip
|
||||||
if extension and re.match(r'bz2', extension):
|
if extension and re.match(r'bz2', extension):
|
||||||
|
|
Loading…
Reference in a new issue