diff options
author | Claude Paroz <claude@2xlibre.net> | 2020-02-12 20:12:53 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-12 21:12:53 +0200 |
commit | aaeb5c83600052f6696eb09a155112bc0252fffa (patch) | |
tree | 8af2cc62f8966ec79f6300c9a27d1e017a09d4cc | |
parent | 7a6c623cca51293d82bfc1f09bb1aa123708f2da (diff) | |
download | tablib-aaeb5c83600052f6696eb09a155112bc0252fffa.tar.gz |
Fixes #226 - Allow importing ragged CSV files (#456)
-rw-r--r-- | HISTORY.md | 5 | ||||
-rw-r--r-- | src/tablib/formats/_csv.py | 2 | ||||
-rwxr-xr-x | tests/test_tablib.py | 19 |
3 files changed, 26 insertions, 0 deletions
@@ -9,6 +9,11 @@ will remain in Tablib 1.x and will be fixed (reversed) in Tablib 2.0.0 (#453). If you count on the broken behavior, please update your code when you upgrade to Tablib 2.x. +### Improvements + +- Tablib is now able to import CSV content where not all rows have the same + length. Missing columns on any line receive the empty string (#226). + ## 1.0.0 (2020-01-13) ### Breaking changes diff --git a/src/tablib/formats/_csv.py b/src/tablib/formats/_csv.py index 14d7bb2..b0bf435 100644 --- a/src/tablib/formats/_csv.py +++ b/src/tablib/formats/_csv.py @@ -46,6 +46,8 @@ class CSVFormat: if (i == 0) and (headers): dset.headers = row elif row: + if i > 0 and len(row) < dset.width: + row += [''] * (dset.width - len(row)) dset.append(row) @classmethod diff --git a/tests/test_tablib.py b/tests/test_tablib.py index b20b669..3acdd44 100755 --- a/tests/test_tablib.py +++ b/tests/test_tablib.py @@ -804,6 +804,25 @@ class CSVTests(BaseTestCase): data.csv = csv_text self.assertEqual(data.width, 7) + def test_csv_import_set_ragged(self): + """Import CSV set when not all rows have the same length.""" + csv_text = ( + "H1,H2,H3\n" + "A,B\n" + "C,D,E\n" + "\n" + "F\n" + ) + dataset = tablib.import_set(csv_text, format="csv") + self.assertEqual( + str(dataset), + 'H1|H2|H3\n' + '--|--|--\n' + 'A |B | \n' + 'C |D |E \n' + 'F | | ' + ) + def test_csv_export(self): """Verify exporting dataset object as CSV.""" |