Source code for classes.DataIO

import numbers
import numpy
import operator
import inspect



[docs]class DataIO(): ''' This class provides standarized Data IO that should be used in the procedures, scriptcontroller and DataViewer '''
[docs] @staticmethod def writeData(openFile, data, Data_Name=''): '''Takes data in form of nested lists or singular value and a experiment name, and writes it to a results file. The parmater is tested to be either a file handler (in which case its considered open) or a str in which case its considered to be a path to a file to which the data will be appended. ''' # check whether call was local or generated from ethernet_interface # Traverse Stack and search for the ethernet_interface for entry in inspect.stack(context=0): if "EthernetInterface" in entry[1]: return # TODO check data type # Test openFile parameter if type(openFile) is file: # It is already a file handler - everything is good pass elif type(openFile) is str: try: # Try to open file openFile = open(openFile,'a') except: print "Cannot open file for writing" return else: print "Wrong argument type for openFile" return #Check Dimension of data if DataIO._test_dim(data) > 2: # If Dimension bigger 2 than recursively dive into file for substruct in data: DataIO.writeData(openFile, substruct, Data_Name+'_'+str(data.index(substruct))) elif DataIO._test_dim(data) <= 2 and DataIO._test_dim(data) >= -1: # If a 2 dim data block or less write csv block DataIO._write_csv(openFile, data ,Data_Name,DataIO._test_dim(data)) elif type(data) == str : # if the data is a str just write it into file openFile.write(data) openFile.flush() else: print "Could not write data to file: Error in Data Format" # Seperate the experiments by one extra new lines openFile.write('\n') openFile.flush()
@staticmethod def _write_csv(openFile, data ,name,dim): ''' Writes Single dimensional lists to file''' openFile.write("##{}:\n".format(name)) openFile.flush() if dim == 2: for sublist in data: for elem in sublist: openFile.write("{}\t".format(elem)) openFile.write("\n") elif dim == 1: for elem in data: openFile.write("{}\n".format(elem)) elif dim == 0: openFile.write("\n") elif dim == -1: openFile.write(str(data)) openFile.write("\n") openFile.flush() return @staticmethod def _test_dim(testlist, dim=0): """tests if testlist is a list and how many dimensions it has. Returns -1 if testlist is a number returns -2 if it is no list or number, 0 if list is empty and otherwise the dimensions of it""" if isinstance(testlist, list): if testlist == []: return dim dim = dim + 1 dim = DataIO._test_dim(testlist[0], dim) return dim elif isinstance(testlist, numbers.Number) and dim == 0: return -1 else: if dim == 0: return -2 else: return dim
[docs] @staticmethod def get_test_names(path): NameList=[] try: with open(path,'r') as MeasFile: if MeasFile is None: print 'Problem reading Measurement file.' exit() for num, line in enumerate(MeasFile, 1): if line[:2] == '##' : NameList.append(str(num)+'@'+line[2:-2]) except IOError: pass # No file was selected, no reason to report an error except Exception as e: print("Error: {}".format(e)) if NameList==[]: return ['NoName'] return NameList
[docs] @staticmethod def get_test_data(path, test_name): Data=[] with open(path, 'r') as MeasFile: if MeasFile is None: print 'Problem reading Measurement file.' exit() in_block = False for num, line in enumerate(MeasFile, 1): if (in_block and line[0:-1] != ''): SubList = line[0:-1].split('\t') CleanSubList = [] for elem in SubList: if elem != '': CleanSubList.append(float(elem)) Data.append(CleanSubList) if in_block and line[0:-1] == '': return Data if test_name in str(num)+'@'+line[2:] or (test_name == 'NoName' and in_block == False): in_block = True if in_block == True: return Data print 'Reading Data from File failed' return False
[docs] @staticmethod def usage_prep(usage_list): usage_text = 'USAGE:\n' for tool_info in usage_list: usage_text += tool_info + '\n' return usage_text
[docs] @staticmethod def parameter_prep(Stages, Maitre, arg_string,func_parameter_list): ''' The function interpretes Input strings and prepares input paramters for functions. It also swaps MAitre/Stages keywords for the objects that are then passed to the functions. func_parameter_list are the expected paramters of the function for which the parameters are prepared. This allows to swap in Maitre and Stages where needed. ''' PreArgList=arg_string.split(' ') ArgList=[] # String Interpretation for elem in PreArgList: if '[' in elem: SubList=elem.replace('[','').replace(']','').split(',') elem=map(float,SubList) if 'Stages' in elem: elem = Stages if 'Maitre' in elem: elem = Maitre if str(elem).isdigit(): elem=float(elem) if elem == '': continue ArgList.append(elem) direct_list = func_parameter_list insert_list = [] if "Stages" in direct_list: insert_list.append([direct_list.index("Stages"),Stages]) if "stages" in direct_list: insert_list.append([direct_list.index("stages"),Stages]) if "Maitre" in direct_list: insert_list.append([direct_list.index("Maitre"),Maitre]) if "maitre" in direct_list: insert_list.append([direct_list.index("maitre"),Maitre]) insert_list.sort(key=operator.itemgetter(0)) if insert_list != []: for x in insert_list: ArgList.insert(x[0],x[1]) return ArgList
if __name__ == "__main__" : openFile = 'HelloWorld.txt' openFile = open(openFile,'a') data = [[1,2,3],[2,3,4],[3,4,5]] Data_Name = 'Exp1' print type(data) print DataIO._test_dim(data) DataIO.writeData(openFile, data, Data_Name) ''' Copyright (C) 2017 Robert Polster This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. '''