utils.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import sys
  2. import argparse
  3. def reduce_file_size(filename, new_filename, n_packages, header_size=0, packet_size=32):
  4. """
  5. Create a smaller version of a binary file containing a defined number of data packages
  6. The file structure has to consist of a header (header_size) and multiple data packages of
  7. size packet_size. This preserves the header and only reduces the number of data packages.
  8. Parameters
  9. ----------
  10. filename:
  11. The source filename to load from.
  12. new_filename:
  13. The target filename to save to. Will be overwritten if it exists.
  14. n_packages:
  15. The number of packages to preserve in the file
  16. header_size:
  17. The size of the file header in byte. Default 0
  18. packet_size:
  19. The size of a single data package in byte. Default 32
  20. Returns
  21. -------
  22. """
  23. with open(filename, 'rb') as f:
  24. data = f.read(header_size + n_packages * packet_size)
  25. with open(new_filename, 'wb') as f:
  26. f.write(data)
  27. param_help = """
  28. tdt-tev': {'header_size': 0, 'packet_size': 8}, # uint8
  29. 'tdt-tsq': {'header_size': 0, 'packet_size': 40*8},
  30. 'tdt-sev': {'header_size': 0, 'packet_size': 8}, # uint8
  31. 'edf': {'header_size': 256 (number_of_signals + 1), # 256 byte per channel and header
  32. 'packet_size': number_of_signals * samples_in_datarecord * 2}}, # int16
  33. 'ncs': {'header_size': 2048,
  34. 'packet_size': 20+2*(samples_in_datarecord), #int16}
  35. """
  36. if __name__ == '__main__':
  37. parser = argparse.ArgumentParser(description='Bit-based file manipulation')
  38. subparsers = parser.add_subparsers(help='cut file', dest='subparser_name')
  39. # create the parser for the "cut" command
  40. parser_cut = subparsers.add_parser('cut', help='shorten file to limited bits')
  41. parser_cut.add_argument('filename', type=str, help='name of the file to load')
  42. parser_cut.add_argument('new_filename', type=str, help='name of the file to save')
  43. parser_cut.add_argument('n_packages', type=int, help='number of packages to preserve')
  44. parser_cut.add_argument('--header_size', metavar='header_size', type=int, nargs=1,
  45. help='the size of the file header in bits')
  46. parser_cut.add_argument('--packet_size', metavar='packet_size', type=int, nargs=1,
  47. help='the size of the data packets in bits')
  48. # add parser for printing help options for parameters
  49. parser.add_argument('--parameter_help', help='show suggested parameters', action='store_true')
  50. args = parser.parse_args()
  51. if args.parameter_help:
  52. print(param_help)
  53. elif args.subparser_name == 'cut':
  54. kwargs = {k: getattr(args, k)[0] for k in ['header_size', 'packet_size'] if k in args}
  55. reduce_file_size(filename=args.filename, new_filename=args.new_filename,
  56. n_packages=args.n_packages, **kwargs)