Source code for pyface.data_view.data_formats

# (C) Copyright 2005-2023 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in LICENSE.txt and may be redistributed only under
# the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Thanks for using Enthought open source!
import csv
from functools import partial
from io import BytesIO, StringIO
import os
import json

from pyface.data_view.i_data_wrapper import DataFormat, text_format


# Scalar formats

[docs]def to_json(data, default=None): """ Serialize an object to a JSON bytestring. Parameters ---------- data : Any The data to be serialized. default : Callable or None Callable that takes a Python object and returns a JSON-serializable data structure. Returns ------- raw_data : bytes The serialized data as a bytestring. """ str_data = json.dumps(data, default=default, separators=(',', ':')) return str_data.encode('utf-8')
[docs]def from_json(raw_data, object_hook=None): """ Deserialize a JSON bytestring. Parameters ---------- raw_data : bytes The serialized JSON data as a byte string. object_hook : Callable Callable that takes a dictionary and returns an corresponding Python object. Returns ------- data : Any The data extracted. """ return json.loads(raw_data.decode('utf-8'), object_hook=object_hook)
#: The text/plain format with utf-8 encoding. standard_text_format = text_format() #: The text/html format with utf-8 encoding. html_format = text_format(mimetype='text/html') #: A generic JSON format. json_format = DataFormat('application/json', to_json, from_json) # 1D formats
[docs]def to_csv_row(data, delimiter=',', encoding='utf-8', **kwargs): """ Serialize a list to a single-row CSV bytestring. Parameters ---------- data : list The list to be serialized. Any elements which are not strings will be converted to strings by calling ``str()``. delimiter : str The CSV delimiter. encoding : str The encoding of the bytes **kwargs Additional arguments to csv.writer. Returns ------- raw_data : bytes The serialized data as a bytestring. """ fp = StringIO() writer = csv.writer(fp, delimiter=delimiter, **kwargs) writer.writerow(data) return fp.getvalue().encode(encoding)
[docs]def from_csv_row(raw_data, delimiter=',', encoding='utf-8', **kwargs): """ Deserialize the first row of a CSV bytestring as a list. Any rows beyond the first are ignored. Parameters ---------- raw_data : bytes The serialized CSV data as a byte string. delimiter : str The CSV delimiter. encoding : str The encoding of the bytes **kwargs Additional arguments to csv.reader. Returns ------- data : list of str The data extracted as a list of strings. """ fp = StringIO(raw_data.decode(encoding)) reader = csv.reader(fp, delimiter=delimiter, **kwargs) return next(reader)
[docs]def to_csv_column(data, delimiter=',', encoding='utf-8', **kwargs): """ Serialize a list to a single-column CSV bytestring. Parameters ---------- data : list The list to be serialized. Any elements which are not strings will be converted to strings by calling ``str()``. delimiter : str The CSV delimiter. encoding : str The encoding of the bytes **kwargs Additional arguments to csv.writer. Returns ------- raw_data : bytes The serialized data as a bytestring. """ fp = StringIO() writer = csv.writer(fp, delimiter=delimiter, **kwargs) for row in data: writer.writerow([row]) return fp.getvalue().encode(encoding)
[docs]def from_csv_column(raw_data, delimiter=',', encoding='utf-8', **kwargs): """ Deserialize the first column of a CSV bytestring as a list. Any columns beyond the first are ignored. Parameters ---------- raw_data : bytes The serialized CSV data as a byte string. delimiter : str The CSV delimiter. encoding : str The encoding of the bytes **kwargs Additional arguments to csv.reader. Returns ------- data : list of str The data extracted as a list of strings. """ fp = StringIO(raw_data.decode(encoding)) reader = csv.reader(fp, delimiter=delimiter, **kwargs) return [row[0] for row in reader]
text_row_format = DataFormat( 'text/plain', partial(to_csv_row, delimiter='\t', lineterminator=os.linesep), partial(from_csv_row, delimiter='\t'), ) csv_row_format = DataFormat('text/csv', to_csv_row, from_csv_row) text_column_format = DataFormat( 'text/plain', partial(to_csv_column, delimiter='\t', lineterminator=os.linesep), partial(from_csv_column, delimiter='\t'), ) csv_column_format = DataFormat('text/csv', to_csv_column, from_csv_column) # 2D formats
[docs]def to_csv(data, delimiter=',', encoding='utf-8', **kwargs): """ Serialize a list of lists to a CSV bytestring. Parameters ---------- data : list of lists The data to be serialized. Any elements which are not strings will be converted to strings by calling ``str()``. delimiter : str The CSV delimiter. encoding : str The encoding of the bytes **kwargs Additional arguments to csv.writer. Returns ------- raw_data : bytes The serialized data as a bytestring. """ fp = StringIO() writer = csv.writer(fp, delimiter=delimiter, **kwargs) for row in data: writer.writerow(row) return fp.getvalue().encode(encoding)
[docs]def from_csv(raw_data, delimiter=',', encoding='utf-8', **kwargs): """ Deserialize a CSV bytestring. Parameters ---------- raw_data : bytes The serialized CSV data as a byte string. delimiter : str The CSV delimiter. encoding : str The encoding of the bytes **kwargs Additional arguments to csv.reader. Returns ------- data : list of list of str The data extracted as a list of lists of strings. """ fp = StringIO(raw_data.decode(encoding)) reader = csv.reader(fp, delimiter=delimiter, **kwargs) return list(reader)
[docs]def to_npy(data): """ Serialize an array to a bytestring using .npy format. Parameters ---------- data : array-like The array to be serialized. Returns ------- raw_data : bytes The serialized data as a bytestring. """ import numpy as np data = np.atleast_2d(data) fp = BytesIO() np.save(fp, data, allow_pickle=False) return fp.getvalue()
[docs]def from_npy(raw_data): """ Deserialize a .npy-format bytestring. Parameters ---------- raw_data : bytes The serialized CSV data as a byte string. Returns ------- data : list of list of str The data extracted as a list of lists of strings. """ import numpy as np fp = BytesIO(raw_data) return np.load(fp, allow_pickle=False)
table_format = DataFormat( 'text/plain', partial(to_csv, delimiter='\t', lineterminator=os.linesep), partial(from_csv, delimiter='\t'), ) csv_format = DataFormat('text/csv', to_csv, from_csv) npy_format = DataFormat('application/x-npy', to_npy, from_npy)