#! /usr/bin/env python
"""Unzip with encoded filenames
- Written by Oleg Broytman. Copyright (C) 2009, 2010 PhiloSoft Design.
+ Written by Oleg Broytman. Copyright (C) 2009-2016 PhiloSoft Design.
"""
import sys, os, time
from getopt import getopt, GetoptError
+from shutil import copyfileobj
from zipfile import ZipFile
from m_lib.defenc import default_encoding
sys.exit('Usage: %s file.zip' % sys.argv[0])
try:
- options, arguments = getopt(sys.argv[1:], '')
+ options, arguments = getopt(sys.argv[1:], '')
except GetoptError:
usage()
-if len(arguments) <> 1:
+if len(arguments) != 1:
usage()
zf = ZipFile(arguments[0], 'r')
for zinfo in zf.infolist():
path = zinfo.filename
- if not isinstance(path, unicode):
+ if isinstance(path, bytes):
path = path.decode('cp866')
recoded_path = path.encode(default_encoding)
- print recoded_path
+ print(recoded_path)
if path.startswith('./'):
- tgt = os.path.join(out, recoded_path[2:])
- else:
- tgt = os.path.join(out, recoded_path)
+ recoded_path = recoded_path[2:]
+ tgt = os.path.join(out, recoded_path)
tgtdir = os.path.dirname(tgt)
if not os.path.exists(tgtdir):
os.makedirs(tgtdir)
if not tgt.endswith('/'):
+ infile = zf.open(zinfo.filename)
fp = open(tgt, 'wb')
- fp.write(zf.read(zinfo.filename))
+ copyfileobj(infile, fp)
fp.close()
+ infile.close()
dt = time.mktime(zinfo.date_time + (0, 0, -1))
os.utime(tgt, (dt, dt))
zf.close()