diff --git a/modules/base/pymod/table.py b/modules/base/pymod/table.py index 284c0419ff0aadc8cc86cf64828698811829cc9b..0f902e3e13ed19a2eefe0397e8be457b9a62da96 100644 --- a/modules/base/pymod/table.py +++ b/modules/base/pymod/table.py @@ -426,8 +426,9 @@ class Table(object): self._AddRowsFromDict(data, overwrite) else: if len(data)!=len(self.col_names): + print data, self.col_names msg='data array must have %d elements, not %d' - raise ValueError(msg % (len(self.col_names), len(self.data))) + raise ValueError(msg % (len(self.col_names), len(data))) new_row = [self._Coerce(v, t) for v, t in zip(data, self.col_types)] # fully overwrite existing row with new data @@ -529,6 +530,7 @@ class Table(object): @staticmethod def _LoadOST(stream_or_filename): fieldname_pattern=re.compile(r'(?P<name>[^[]+)(\[(?P<type>\w+)\])?') + values_pattern=re.compile("([^\" ]+|\"[^\"]*\")+") if not hasattr(stream_or_filename, 'read'): stream=open(stream_or_filename, 'r') else: @@ -556,7 +558,7 @@ class Table(object): tab=Table(fieldnames, fieldtypes) header=True continue - tab.AddRow(line.split()) + tab.AddRow([x.strip('"') for x in values_pattern.findall(line)]) if num_lines==0: raise IOError("Cannot read table from empty stream") return tab diff --git a/modules/base/tests/test_table.py b/modules/base/tests/test_table.py index 3edf226be0acae3acf79ce89e909cad4bbbeaaab..ca6da29208d776b29753ee325ebc1faf565793f9 100644 --- a/modules/base/tests/test_table.py +++ b/modules/base/tests/test_table.py @@ -757,6 +757,18 @@ class TestTable(unittest.TestCase): in_stream = open(os.path.join('testfiles','emptytable.csv'), 'r') self.assertRaises(IOError, Table.Load, in_stream) + def testSaveLoadTableOSTWithSpaces(self): + tab = self.CreateTestTable() + tab.AddRow(['hello spaces',10, 10.1], overwrite=None) + self.CompareDataFromDict(tab, {'first': ['x','foo',None,'hello spaces'], 'second': [3,None,9,10], 'third': [None,2.2,3.3,10.1]}) + + # write to disc + tab.Save("saveloadtable_withspaces_filename_out.tab") + + # read from disc + tab_loaded_fname = Table.Load('saveloadtable_withspaces_filename_out.tab') + self.CompareDataFromDict(tab_loaded_fname, {'first': ['x','foo',None,'hello spaces'], 'second': [3,None,9,10], 'third': [None,2.2,3.3,10.1]}) + def testSaveLoadTableCSV(self): tab = self.CreateTestTable() self.CompareDataFromDict(tab, {'first': ['x','foo',None], 'second': [3,None,9], 'third': [None,2.2,3.3]})