Source code for odml_csv_table

# -*- coding: utf-8 -*-
"""

"""

__package__='odmltables'

import csv

from .odml_table import OdmlTable


[docs]class OdmlCsvTable(OdmlTable): """ Class to create a csv-file from an odml-file """ def __init__(self, load_from=None): super(OdmlCsvTable, self).__init__(load_from=load_from)
[docs] def write2file(self, save_to): """ writes the data from the odml-file to a csv-file. Each line of the table represents one Value of the odml-file. By changing the header of the table you can choose, which informations about those values will be shown in the table. You can also decide, not to include information about every specific value in your header, for example if you just want to get an overview of your odml-structur. Then rows, that would be empty will be skipped and not printed in the table. :param save_to: name of the csv-file :type save_to: string """ self.consistency_check() with open(save_to, 'w') as csvfile: len_docdict = 0 if not self._docdict else len(self._docdict) fieldnames = list(range(max(len(self._header), len_docdict * 2 + 1))) csvwriter = csv.DictWriter(csvfile, fieldnames=fieldnames, dialect='excel', quoting=csv.QUOTE_NONNUMERIC) oldpath = "" oldprop = "" # writing document info if self._docdict: doc_list = ['Document Information'] for doc_key in sorted(self._docdict): doc_list = doc_list + [doc_key, self._docdict[doc_key]] csvwriter.writerow(dict(zip(range(len(doc_list)), doc_list))) # writing document headers header_list = [self._header_titles[h] if h is not None else "" for h in self._header] csvwriter.writerow(dict(zip(range(len(header_list)), header_list))) for dic in self._odmldict: # create a copy of the dictionary, so nothing in the odml_dict # will be changed tmp_row = dic.copy() # inflate dictionary to fit to column headers tmp_row['Path'], tmp_row['PropertyName'] = tmp_row['Path'].split(':') tmp_row['SectionName'] = tmp_row['Path'].split('/')[-1] # removing section entries (if necessary) if tmp_row["Path"].split(':')[0] == oldpath: if not self.show_all_sections: for h in self._SECTION_INF + ['SectionName', 'Path']: tmp_row[h] = "" else: oldpath = tmp_row["Path"].split(':')[0] # if a new section begins all property- and value- # information should be written, even if its the same as # in the line before, so oldvalinf and oldprop are reset oldprop = "" # removing property entries (if neccessary) if tmp_row['PropertyName'] == oldprop: if not self.show_all_properties: for h in self._PROPERTY_INF + ['PropertyName']: tmp_row[h] = "" else: oldprop = tmp_row['PropertyName'] # eliminate those fields that wont show up in the table row = {header_list.index(self._header_titles[h]): tmp_row[h] for h in self._header if h is not None} def write_row(row): # check if row is empty, otherwise write it to the csv-file if not (list(row.values()) == ['' for r in row]): csvwriter.writerow(row) else: pass # writing also rows when value is not present if tmp_row['Value'] == []: tmp_row['Value'] = [''] for v in tmp_row['Value']: if 'Value' in header_list: row[header_list.index('Value')] = v write_row(row) # empty entries for further values to be added for h in self._header: if ((not self.show_all_properties and h in self._PROPERTY_INF + ['PropertyName']) or (not self.show_all_sections and h in self._SECTION_INF + ['SectionName', 'Path'])): row[header_list.index(self._header_titles[h])] = ''