#! /usr/bin/env python3 """Unzip with encoded filenames Written by Oleg Broytman. Copyright (C) 2009-2023 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 def usage(): sys.exit('Usage: %s file.zip' % sys.argv[0]) try: options, arguments = getopt(sys.argv[1:], '') except GetoptError: usage() if len(arguments) != 1: usage() zf = ZipFile(arguments[0], 'r') out = '.' for zinfo in zf.infolist(): path = zinfo.filename if isinstance(path, bytes): path = path.decode('cp866') recoded_path = path.encode(default_encoding) else: recoded_path = path.encode('cp437').decode('cp866') print(recoded_path) if path.startswith('./'): 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') copyfileobj(infile, fp) fp.close() infile.close() dt = time.mktime(zinfo.date_time + (0, 0, -1)) os.utime(tgt, (dt, dt)) zf.close()