summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaude Paroz <claude@2xlibre.net>2020-02-12 20:12:53 +0100
committerGitHub <noreply@github.com>2020-02-12 21:12:53 +0200
commitaaeb5c83600052f6696eb09a155112bc0252fffa (patch)
tree8af2cc62f8966ec79f6300c9a27d1e017a09d4cc
parent7a6c623cca51293d82bfc1f09bb1aa123708f2da (diff)
downloadtablib-aaeb5c83600052f6696eb09a155112bc0252fffa.tar.gz
Fixes #226 - Allow importing ragged CSV files (#456)
-rw-r--r--HISTORY.md5
-rw-r--r--src/tablib/formats/_csv.py2
-rwxr-xr-xtests/test_tablib.py19
3 files changed, 26 insertions, 0 deletions
diff --git a/HISTORY.md b/HISTORY.md
index e5dd53c..4078e9a 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -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."""