def update_recformats(value, idx): fitsformat = _scalar_to_format(value) recformat = _convert_format(fitsformat) if idx >= len(recformats): recformats.append(recformat) else: if _cmp_recformats(recformats[idx], recformat) < 0: recformats[idx] = recformat
def _populate_table_keywords(self): """Populate the new table definition keywords from the header.""" cols = self.columns append = self._header.append for idx, col in enumerate(cols): for attr, keyword in zip(KEYWORD_ATTRIBUTES, KEYWORD_NAMES): val = getattr(cols, attr + 's')[idx] if val: keyword = keyword + str(idx + 1) if attr == 'format': val = cols._recformats[idx] if isinstance(val, _FormatX): val = repr(val._nx) + 'X' elif isinstance(val, _FormatP): val = val.tform else: val = _convert_format(val, reverse=True) append((keyword, val))
def _dump_data(self, fileobj): """ Write the table data in the ASCII format read by BinTableHDU.load() to fileobj. """ if not fileobj and self._file: root, ext = os.path.splitext(self._file.name) fileobj = root + '.txt' close_file = False if isinstance(fileobj, basestring): fileobj = open(fileobj, 'w') close_file = True linewriter = csv.writer(fileobj, dialect=FITSTableDumpDialect) # Process each row of the table and output one row at a time def format_value(val, format): if format[0] == 'S': itemsize = int(format[1:]) return '%-*s' % (itemsize, val) elif format in np.typecodes['AllInteger']: # output integer return '%21d' % val elif format in np.typecodes['Complex']: return '%21.15g+%.15gj' % (val.real, val.imag) elif format in np.typecodes['Float']: # output floating point return '%#21.15g' % val for row in self.data: line = [] # the line for this row of the table # Process each column of the row. for column in self.columns: vla_format = None # format of data in a variable length array # where None means it is not a VLA format = _convert_format(column.format) if isinstance(format, _FormatP): # P format means this is a variable length array so output # the length of the array for this row and set the format # for the VLA data line.append('VLA_Length=') line.append('%-21d' % len(row[column.name])) repeat, dtype, option = _parse_tformat(column.format) vla_format = FITS2NUMPY[option[0]][0] if vla_format: # Output the data for each element in the array for val in row[column.name].flat: line.append(format_value(val, vla_format)) else: # The column data is a single element dtype = self.data.dtype.fields[column.name][0] array_format = dtype.char if array_format == 'S': array_format += str(dtype.itemsize) line.append(format_value(row[column.name], array_format)) linewriter.writerow(line) if close_file: fileobj.close()