import sys import argparse def reduce_file_size(filename, new_filename, n_packages, header_size=0, packet_size=32): """ Create a smaller version of a binary file containing a defined number of data packages The file structure has to consist of a header (header_size) and multiple data packages of size packet_size. This preserves the header and only reduces the number of data packages. Parameters ---------- filename: The source filename to load from. new_filename: The target filename to save to. Will be overwritten if it exists. n_packages: The number of packages to preserve in the file header_size: The size of the file header in byte. Default 0 packet_size: The size of a single data package in byte. Default 32 Returns ------- """ with open(filename, 'rb') as f: data = f.read(header_size + n_packages * packet_size) with open(new_filename, 'wb') as f: f.write(data) param_help = """ tdt-tev': {'header_size': 0, 'packet_size': 8}, # uint8 'tdt-tsq': {'header_size': 0, 'packet_size': 40*8}, 'tdt-sev': {'header_size': 0, 'packet_size': 8}, # uint8 'edf': {'header_size': 256 (number_of_signals + 1), # 256 byte per channel and header 'packet_size': number_of_signals * samples_in_datarecord * 2}} # int16 """ if __name__ == '__main__': parser = argparse.ArgumentParser(description='Bit-based file manipulation') subparsers = parser.add_subparsers(help='cut file', dest='subparser_name') # create the parser for the "cut" command parser_cut = subparsers.add_parser('cut', help='shorten file to limited bits') parser_cut.add_argument('filename', type=str, help='name of the file to load') parser_cut.add_argument('new_filename', type=str, help='name of the file to save') parser_cut.add_argument('n_packages', type=int, help='number of packages to preserve') parser_cut.add_argument('--header_size', metavar='header_size', type=int, nargs=1, help='the size of the file header in bits') parser_cut.add_argument('--packet_size', metavar='packet_size', type=int, nargs=1, help='the size of the data packets in bits') # add parser for printing help options for parameters parser.add_argument('--parameter_help', help='show suggested parameters', action='store_true') args = parser.parse_args() if args.parameter_help: print(param_help) elif args.subparser_name == 'cut': kwargs = {k: getattr(args, k)[0] for k in ['header_size', 'packet_size'] if k in args} reduce_file_size(filename=args.filename, new_filename=args.new_filename, n_packages=args.n_packages, **kwargs)