docs: def MPTfileCSV(file_or_path):
      """Simple function to open MPT files as csv.DictReader objects
  
      Checks for the correct headings, skips any comments and returns a
      csv.DictReader object and a list of comments
      """
  
      if isinstance(file_or_path, str):
          mpt_file = open(file_or_path, 'r')
      else:
          mpt_file = file_or_path
  
      magic = next(mpt_file)
      if magic.rstrip() != 'EC-Lab ASCII FILE':
          raise ValueError("Bad first line for EC-Lab file: '%s'" % magic)
  
      nb_headers_match = re.match('Nb header lines : (\d+)\s*$', next(mpt_file))
      nb_headers = int(nb_headers_match.group(1))
      if nb_headers < 3:
          raise ValueError("Too few header lines: %d" % nb_headers)
  
      ## The 'magic number' line, the 'Nb headers' line and the column headers
      ## make three lines. Every additional line is a comment line.
      comments = [next(mpt_file) for i in range(nb_headers - 3)]
  
      mpt_csv = csv.DictReader(mpt_file, dialect='excel-tab')
  
      expected_fieldnames = (
          ["mode", "ox/red", "error", "control changes", "Ns changes",
           "counter inc.", "time/s", "control/V/mA", "Ewe/V", "dq/mA.h",
           "P/W", "<I>/mA", "(Q-Qo)/mA.h", "x"],
          ['mode', 'ox/red', 'error', 'control changes', 'Ns changes',
           'counter inc.', 'time/s', 'control/V', 'Ewe/V', 'dq/mA.h',
           '<I>/mA', '(Q-Qo)/mA.h', 'x'],
          ["mode", "ox/red", "error", "control changes", "Ns changes",
           "counter inc.", "time/s", "control/V", "Ewe/V", "I/mA",
           "dQ/mA.h", "P/W"],
          ["mode", "ox/red", "error", "control changes", "Ns changes",
           "counter inc.", "time/s", "control/V", "Ewe/V", "<I>/mA",
           "dQ/mA.h", "P/W"])
      if mpt_csv.fieldnames not in expected_fieldnames:
          raise ValueError("Unrecognised headers for MPT file format")
  
      return mpt_csv, comments