From 78edd09076b31e9efbfaf6170bbcb75fad0ff5ea Mon Sep 17 00:00:00 2001 From: iuvbio Date: Sat, 8 Jun 2019 15:46:38 +0200 Subject: [PATCH] handle missing header --- pandas_ods_reader/parser.py | 18 +++++++++--------- .../tests/rsc/example_missing_header.ods | Bin 0 -> 10921 bytes pandas_ods_reader/tests/test_read_ods.py | 9 +++++++++ 3 files changed, 18 insertions(+), 9 deletions(-) create mode 100644 pandas_ods_reader/tests/rsc/example_missing_header.ods diff --git a/pandas_ods_reader/parser.py b/pandas_ods_reader/parser.py index 771c0d6..b5132b5 100644 --- a/pandas_ods_reader/parser.py +++ b/pandas_ods_reader/parser.py @@ -24,15 +24,15 @@ def load_ods(doc, sheet_id, headers=True, columns=None): # columns as lists in a dictionary columns = [] for cell in row: - if cell.value: - if cell.value not in columns: - columns.append(cell.value) - else: - # add count to column name - idx = 1 - while "{}.{}".format(cell.value, idx) in columns: - idx += 1 - columns.append("{}.{}".format(cell.value, idx)) + if cell.value and cell.value not in columns: + columns.append(cell.value) + else: + column_name = cell.value if cell.value else "unnamed" + # add count to column name + idx = 1 + while "{}.{}".format(column_name, idx) in columns: + idx += 1 + columns.append("{}.{}".format(column_name, idx)) df_dict = OrderedDict((column, []) for column in columns) # create index for the column headers diff --git a/pandas_ods_reader/tests/rsc/example_missing_header.ods b/pandas_ods_reader/tests/rsc/example_missing_header.ods new file mode 100644 index 0000000000000000000000000000000000000000..2b104d91762b632265adbe9896ca337a00d1e88c GIT binary patch literal 10921 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