diff --git a/Orange/data/io.py b/Orange/data/io.py index c3d90308ef4..c8942a87866 100644 --- a/Orange/data/io.py +++ b/Orange/data/io.py @@ -122,9 +122,13 @@ def __init__(self, flags): if self._RE_ALL.match(flag): if '=' in flag: k, v = flag.split('=', 1) - self.attributes[k] = (v if Flags._RE_ATTR_UNQUOTED_STR(v) else - literal_eval(v) if v else - '') + if not Flags._RE_ATTR_UNQUOTED_STR(v): + try: + v = literal_eval(v) + except SyntaxError: + # If parsing failed, treat value as string + pass + self.attributes[k] = v else: setattr(self, flag, True) setattr(self, self.ALL.get(flag, ''), True) @@ -688,7 +692,7 @@ def read(self): except Exception as e: error = e continue - raise ValueError('Cannot parse dataset {}: {}'.format(self.filename, error)) + raise ValueError('Cannot parse dataset {}: {}'.format(self.filename, error)) from error @classmethod def write_file(cls, filename, data): diff --git a/Orange/tests/test_tab_reader.py b/Orange/tests/test_tab_reader.py index 56209c47e99..6a80217d17d 100644 --- a/Orange/tests/test_tab_reader.py +++ b/Orange/tests/test_tab_reader.py @@ -83,6 +83,17 @@ def test_read_and_save_attributes(self): self.assertEqual(c1.name, "Class 1") self.assertEqual(c1.attributes, {'x': 'a longer string'}) + path = "/path/to/somewhere" + c1.attributes["path"] = path + outf = io.StringIO() + outf.close = lambda: None + TabReader.write_file(outf, table) + outf.seek(0) + + table = read_tab_file(outf) + f1, f2, c1, c2 = table.domain.variables + self.assertEqual(c1.attributes["path"], path) + def test_read_data_oneline_header(self): samplefile = """\ data1\tdata2\tdata3