import re from nd2reader.exc import InvalidVersionError def get_version(fh): """ Determines what version the ND2 is. :param fh: an open file handle to the ND2 :type fh: file """ # the first 16 bytes seem to have no meaning, so we skip them fh.seek(16) # the next 38 bytes contain the string that we want to parse. Unlike most of the ND2, this is in UTF-8 data = fh.read(38).decode("utf8") return parse_version(data) def parse_version(data): """ Parses a string with the version data in it. :param data: the 19th through 54th byte of the ND2, representing the version :type data: unicode """ match = re.search(r"""^ND2 FILE SIGNATURE CHUNK NAME01!Ver(?P\d)\.(?P\d)$""", data) if match: # We haven't seen a lot of ND2s but the ones we have seen conform to this return int(match.group('major')), int(match.group('minor')) raise InvalidVersionError("The version of the ND2 you specified is not supported.")