################################################################################
# pdstable/pdsxtable.py
# PdsTableInfo and PdsColumnInfo
# These are the parent classes for Pds3TableInfo and Pds4TableInfo,
# and Pds3ColumnInfo and Pds4ColumnInfo.
################################################################################
from filecache import FCPath
################################################################################
# Class PdsTableInfo
################################################################################
[docs]
class PdsTableInfo:
"""Class to hold the attributes of a PDS-labeled table.
Direct access to this class's attributes by the end user is deprecated and only
supported for backwards compatibility. Use the properties of PdsTable instead.
"""
[docs]
def __init__(self, label_file_path):
self._label_file_remote_path = FCPath(label_file_path)
self._label_file_path = self._label_file_remote_path.retrieve()
self._label_file_name = self._label_file_path.name
self._label = None
self._table_file_name = None
self._table_file_path = None
self._header_bytes = 0
self._fixed_length_row = False
self._field_delimiter = None
self._rows = 0
self._columns = 0
self._row_bytes = 0
self._column_info_list = []
self._column_info_dict = {}
self._dtype0 = {}
@property
def label(self):
"""The label of the table as a Pds3Label for PDS3 or dict for PDS4."""
return self._label
@property
def label_file_name(self):
"""The name of the label file (without the path)."""
return self._label_file_name
@property
def label_file_path(self):
"""The local path to the label file."""
return self._label_file_path
@property
def table_file_name(self):
"""The name of the table file (without the path)."""
return self._table_file_name
@property
def table_file_path(self):
"""The local path to the table file."""
return self._table_file_path
@property
def header_bytes(self):
"""The number of bytes in the header of the table."""
return self._header_bytes
@property
def fixed_length_row(self):
"""True if the table has fixed-length rows."""
return self._fixed_length_row
@property
def field_delimiter(self):
"""The field delimiter for the table."""
return self._field_delimiter
@property
def rows(self):
"""The number of rows in the table."""
return self._rows
@property
def columns(self):
"""The number of columns in the table."""
return self._columns
@property
def row_bytes(self):
"""The number of bytes in a single row of the table."""
return self._row_bytes
@property
def column_info_list(self):
"""The list of PdsColumnInfo objects for the columns in the table."""
return self._column_info_list
@property
def column_info_dict(self):
"""The dict of PdsColumnInfo objects for the columns in the table, keyed by
the column name."""
return self._column_info_dict
@property
def dtype0(self):
"""The dtype dictionary for the table, keyed by the column name.
Each value is a tuple of (dtype_string, start_byte) where dtype_string is the
string representation of the dtype (e.g., 'S10' for a 10-character string)
and start_byte is the starting byte position of the column in a row.
"""
return self._dtype0
################################################################################
# Class PdsColumnInfo
################################################################################
[docs]
class PdsColumnInfo:
"""Class to hold the attributes of one column in a PDS-labeled table.
Direct access of this class's attributes by the end user is not generally necessary,
but is permitted if you want the inner details of each column.
"""
[docs]
def __init__(self):
self._name = None
self._colno = None
self._start_byte = None
self._bytes = None
self._items = None
self._item_bytes = None
self._item_offset = None
self._data_type = None
self._dtype0 = None
self._dtype1 = None
self._dtype2 = None
self._scalar_func = None
self._valid_range = None
self._invalid_values = None
@property
def name(self):
"""The name of the column."""
return self._name
@property
def colno(self):
"""The index number of the column, starting at zero."""
return self._colno
@property
def start_byte(self):
"""The starting byte of the column in the row (1-based)."""
return self._start_byte
@property
def bytes(self):
"""The number of bytes in the column."""
return self._bytes
@property
def items(self):
"""The number of items in the column (PDS3 only)."""
return self._items
@property
def item_bytes(self):
"""The number of bytes in an item of the column (PDS3 only)."""
return self._item_bytes
@property
def item_offset(self):
"""The incremental offset of each item within the column."""
return self._item_offset
@property
def data_type(self):
"""The data type of the column.
Possible values are 'int', 'float', 'time', and 'string'.
"""
return self._data_type
@property
def dtype0(self):
"""The dtype of the entire column as a string.
Each value is a tuple of (dtype_string, start_byte) where dtype_string is the
string representation of the dtype (e.g., 'S10' for a 10-character string)
and start_byte is the starting byte position of the column in a row.
"""
return self._dtype0
@property
def dtype1(self):
"""The dtype of a multiple-item column.
If items == 0, this value is None. Otherwise, it is a dict keyed by 'item_0',
'item_1', etc. with the value being a tuple of the string representation of
the dtype used to isolate each item as a string (Snnn) and the starting byte
relative to the beginning of the column for that item.
"""
return self._dtype1
@property
def dtype2(self):
"""The dtype of the column with the actual data type.
Possible values are 'int', 'float', 'S', and 'U'.
"""
return self._dtype2
@property
def scalar_func(self):
"""The scalar function used to convert the column's string value to its data
value."""
return self._scalar_func
@property
def valid_range(self):
"""The valid range of the column as a tuple (lower, upper) or None."""
return self._valid_range
@property
def invalid_values(self):
"""The set of invalid value markers for the column.
If the column's value equals one of these markers, the column value is considered
invalid.
"""
return self._invalid_values