import zipfile import argparse import logging import struct def main(): objects = [] _ch = logging.StreamHandler() _ch.setLevel("DEBUG") _formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') _ch.setFormatter(_formatter) logger = logging.getLogger(__name__) logger.addHandler(_ch) logger.setLevel("DEBUG") parser = argparse.ArgumentParser() parser.add_argument("map_file", help="map file, or bin if you also use --bin") parser.add_argument("--bin", action="store_true", help="use this if the file is already a .bin file") args = parser.parse_args() map_file = args.map_file _fh = logging.FileHandler(args.map_file+".log") _fh.setFormatter(_formatter) logger.addHandler(_fh) if not args.bin: logger.info("Opening %s", map_file) zip_file = zipfile.ZipFile(map_file) files = zip_file.namelist() bin_filename = None for file in files: logger.info("Found file %s", file) if file.endswith(".bin"): bin_filename = file logger.info("Found BIN file %s", bin_filename) break if not bin_filename: logger.error("FATAL: BIN file not found") zip_file.close() exit(1) fp = zip_file.open(bin_filename) else: bin_filename = args.map_file fp = open(bin_filename, "rb") logger.info("Opening %s", bin_filename) with fp as bin_file: byte = bin_file.read(1) while byte != b"": if byte == b'\x2a': # start object # object is 20 bytes long model = struct.unpack("