Source code for spectrochempy.core.writers.write_csv

# ======================================================================================
# Copyright (©) 2015-2025 LCS - Laboratoire Catalyse et Spectrochimie, Caen, France.
# CeCILL-B FREE SOFTWARE LICENSE AGREEMENT
# See full LICENSE agreement in the root directory.
# ======================================================================================
"""Plugin module to extend NDDataset with a JCAMP-DX export method."""

# import os as os
import csv

from spectrochempy.core import preferences as prefs
from spectrochempy.core.writers.exporter import Exporter
from spectrochempy.core.writers.exporter import exportermethod

__all__ = ["write_csv"]
__dataset_methods__ = __all__


[docs] def write_csv(*args, **kwargs): """ Write a dataset in CSV format. Currently only implemented for 1D datasets or ND datasets with only one dimension of length larger than one. Parameters ---------- filename: str or pathlib object, optional If not provided, a dialog is opened to select a file for writing. protocol : {'scp', 'matlab', 'jcamp', 'csv', 'excel'}, optional Protocol used for writing. If not provided, the correct protocol is inferred (whnever it is possible) from the file name extension. directory : str, optional Where to write the specified `filename` . If not specified, write in the current directory. description: str, optional A Custom description. delimiter : str, optional Set the column delimiter in CSV file. By default it is ',' or the one set in SpectroChemPy `Preferences` . Returns ------- out : `pathlib` object Path of the saved file. Examples -------- >>> ds = scp.NDDataset([1, 2, 3]) >>> f1 = ds.write_csv('myfile') >>> ds = scp.read('irdata/nh4y-activation.spg') >>> f2 = ds[0].write_csv('single_spectrum.csv') """ exporter = Exporter() kwargs["filetypes"] = ["CSV files (*.csv)"] kwargs["suffix"] = ".csv" return exporter(*args, **kwargs)
@exportermethod def _write_csv(*args, **kwargs): dataset, filename = args dataset.filename = filename delimiter = kwargs.get("delimiter", prefs.csv_delimiter) # check dimensionality of the dataset if dataset.squeeze().ndim > 1: raise NotImplementedError("Only implemented for 1D NDDatasets") # squeeze if necessary if dataset.ndim > 1: dataset = dataset.squeeze() # Make csv file for 1D dataset: first and 2d column are the unique axis and data, respectively with filename.open("w", newline="") as fid: writer = csv.writer(fid, delimiter=delimiter) if dataset.ndim == 1: # if statement for future implementation for ndim > 1.... if dataset.coordset is not None: col_coord = True title_1 = dataset.coordset[-1].title if dataset.coordset[-1].units is not None: title_1 += f" / {dataset.coordset[-1].units: ~D}" else: col_coord = False if dataset.units is not None: title_2 = dataset.title + " / " + str(dataset.units) else: title_2 = dataset.title coltitles = [title_1, title_2] if col_coord else [title_2] writer.writerow(coltitles) if col_coord: for i, data in enumerate(dataset.data): writer.writerow([dataset.coordset[-1].data[i], data]) else: for _i, data in enumerate(dataset.data): writer.writerow([data]) return filename