def read_3_markers(self, markers, macro_rewind=True): """ Micro-optimizes ``read_markers`` for 3 markers. Parameters ---------- markers : List[int, int, int] markers to get; markers = [-10, 1, 0] Raises ------ FortranMarkerError if the expected table number is not found """ data = self.read_3_blocks() imarkers = self.struct_3i.unpack(data) for i, marker in enumerate(markers): if marker != imarker: msg = 'marker=%r imarker=%r; markers=%s; i=%s; table_name=%r' % ( marker, imarker, markers, i, self.table_name) raise FortranMarkerError(msg) if self.is_debug_file: self.binary_debug.write(' read_markers -> [4, %i, 4]\n' % marker)
def read_markers(self, markers, macro_rewind=True): """ Gets specified markers, where a marker has the form of [4, value, 4]. The "marker" corresponds to the value, so 3 markers takes up 9 integers. These are used to indicate position in the file as well as the number of bytes to read. Because we're checking the markers vs. what we expect, we just throw the data away. Parameters ---------- markers : List[int] markers to get; markers = [-10, 1] Raises ------ FortranMarkerError if the expected table number is not found """ for i, marker in enumerate(markers): data = self.read_block() imarker, = self.struct_i.unpack(data) if marker != imarker: import os msg = 'marker=%r imarker=%r; markers=%s; i=%s; table_name=%r; iloc=%s/%s' % ( marker, imarker, markers, i, self.table_name, self.f.tell(), os.path.getsize(self.op2_filename)) raise FortranMarkerError(msg) if self.is_debug_file: self.binary_debug.write(' read_markers -> [4, %i, 4]\n' % marker)
def _skip_record_ndata(self, stream=False, debug=True, macro_rewind=False): """the skip version of ``_read_record_ndata``""" markers0 = self.get_nmarkers(1, rewind=False, macro_rewind=macro_rewind) if self.is_debug_file and debug: self.binary_debug.write('read_record - marker = [4, %i, 4]; macro_rewind=%s\n' % ( markers0[0], macro_rewind)) record, nrecord = self._skip_block_ndata() if self.is_debug_file and debug: self.binary_debug.write('read_record - record = [%i, recordi, %i]; ' 'macro_rewind=%s\n' % (nrecord, nrecord, macro_rewind)) if markers0[0]*4 != nrecord: msg = 'markers0=%s*4 len(record)=%s; table_name=%r' % ( markers0[0]*4, nrecord, self.table_name) raise FortranMarkerError(msg) markers1 = self.get_nmarkers(1, rewind=True) if markers1[0] > 0: while markers1[0] > 0: markers1 = self.get_nmarkers(1, rewind=False) if self.is_debug_file and debug: self.binary_debug.write('read_record - markers1 = [4, %i, 4]\n' % markers1[0]) recordi, nrecordi = self._skip_block_ndata() nrecord += nrecordi markers1 = self.get_nmarkers(1, rewind=True) if self.is_debug_file and debug: self.binary_debug.write('read_record - markers1 = [4, %i, 4]\n' % markers1[0]) return record, nrecord
def _stream_record(self, debug=True): """ Creates a "for" loop that keeps giving us records until we're done. """ self.istream = 0 markers0 = self.get_nmarkers(1, rewind=False) if self.is_debug_file and debug: self.binary_debug.write('_stream_record - marker = [4, %i, 4]\n' % markers0[0]) record, nrecord = self._read_block_ndata() if self.is_debug_file and debug: self.binary_debug.write('_stream_record - record = [%i, recordi, %i]\n' % ( nrecord, nrecord)) if(markers0[0]*4) != len(record): raise FortranMarkerError('markers0=%s*4 len(record)=%s; table_name=%r' % ( markers0[0]*4, len(record), self.table_name)) yield record self.istream += 1 markers1 = self.get_nmarkers(1, rewind=True) if self.is_debug_file and debug: self.binary_debug.write('_stream_record - markers1 = [4, %s, 4]\n' % str(markers1)) # handling continuation blocks #nloop = 0 while markers1[0] > 0: markers1 = self.get_nmarkers(1, rewind=False) if self.is_debug_file and debug: self.binary_debug.write('_stream_record - markers1 = [4, %s, 4]\n' % str(markers1)) record, nrecordi = self._read_block_ndata() yield record self.istream += 1 markers1 = self.get_nmarkers(1, rewind=True)
def _read_record_ndata(self, stream=False, debug=True, macro_rewind=False): """reads a record and the length of the record""" markers0 = self.get_nmarkers(1, rewind=False, macro_rewind=macro_rewind) if self.is_debug_file and debug: self.binary_debug.write( 'read_record - marker = [4, %i, 4]; macro_rewind=%s\n' % (markers0[0], macro_rewind)) record, nrecord = self._read_block_ndata() if self.is_debug_file and debug: msg = 'read_record - record = [%i, recordi, %i]; macro_rewind=%s\n' % ( nrecord, nrecord, macro_rewind) self.binary_debug.write(msg) if markers0[0] * 4 != len(record): raise FortranMarkerError( 'markers0=%s*4 len(record)=%s; table_name=%r' % (markers0[0] * 4, len(record), self.table_name)) markers1 = self.get_nmarkers(1, rewind=True) if markers1[0] > 0: nloop = 0 records = [record] while markers1[0] > 0: markers1 = self.get_nmarkers(1, rewind=False) if self.is_debug_file and debug: self.binary_debug.write( 'read_record - markers1 = [4, %i, 4]\n' % markers1[0]) recordi, nrecordi = self._read_block_ndata() nrecord += nrecordi records.append(recordi) #record += recordi markers1 = self.get_nmarkers(1, rewind=True) if self.is_debug_file and debug: self.binary_debug.write( 'read_record - markers1 = [4, %i, 4]\n' % markers1[0]) nloop += 1 # if nloop == 0: # record = records[0] # elif nloop == 1: # record = records[0] + records[1] # else: record = b''.join(records) return record, nrecord
def read_markers(self, markers, macro_rewind=True): """ Gets specified markers, where a marker has the form of [4, value, 4]. The "marker" corresponds to the value, so 3 markers takes up 9 integers. These are used to indicate position in the file as well as the number of bytes to read. Parameters ---------- markers : List[int] markers to get; markers = [-10, 1] """ for i, marker in enumerate(markers): data = self.read_block() imarker, = self.struct_i.unpack(data) if marker != imarker: msg = 'marker=%r imarker=%r; markers=%s; i=%s; table_name=%r' % ( marker, imarker, markers, i, self.table_name) raise FortranMarkerError(msg) if self.is_debug_file: self.binary_debug.write(' read_markers -> [4, %i, 4]\n' % marker)