Skip to content

Commit 6185a34

Browse files
jvanbraekelmdipierro
authored andcommitted
Fix import of CSV files for python 3 (#537)
* Fix impor_csv_file for python 3 + Add specific message for wrong file format and unknown table name * remove the additional )
1 parent c954d1a commit 6185a34

File tree

2 files changed

+20
-20
lines changed

2 files changed

+20
-20
lines changed

pydal/base.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -860,14 +860,15 @@ def import_from_csv_file(self, ifile, id_map=None, null='<NULL>',
860860
id_offset = {} # only used if id_map is None
861861
map_tablenames = map_tablenames or {}
862862
for line in ifile:
863-
line = line.strip()
863+
line = line.decode().strip()
864864
if not line:
865865
continue
866866
elif line == 'END':
867867
return
868-
elif not line.startswith('TABLE ') or \
869-
not line[6:] in self.tables:
870-
raise SyntaxError('invalid file format')
868+
elif not line.startswith('TABLE ') :
869+
raise SyntaxError('Invalid file format')
870+
elif not line[6:] in self.tables:
871+
raise SyntaxError('Unknown table : %s' % line[6:])
871872
else:
872873
tablename = line[6:]
873874
tablename = map_tablenames.get(tablename,tablename)

pydal/objects.py

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,12 @@
4646
'id': '[1-9]\d*',
4747
'decimal': '\d{1,10}\.\d{2}',
4848
'integer': '[+-]?\d*',
49-
'float': '[+-]?\d*(\.\d*)?',
49+
'float': '[+-]?\d*(\.\d*)?',
5050
'double': '[+-]?\d*(\.\d*)?',
5151
'date': '\d{4}\-\d{2}\-\d{2}',
5252
'time': '\d{2}\:\d{2}(\:\d{2}(\.\d*)?)?',
5353
'datetime':'\d{4}\-\d{2}\-\d{2} \d{2}\:\d{2}(\:\d{2}(\.\d*)?)?',
54-
}
54+
}
5555

5656
class Row(BasicStorage):
5757

@@ -381,9 +381,9 @@ def fields(self):
381381

382382
def _structure(self):
383383
keys = ['name','type','writable','listable','searchable','regex','options',
384-
'default','label','unique','notnull','required']
384+
'default','label','unique','notnull','required']
385385
def noncallable(obj): return obj if not callable(obj) else None
386-
return [{key: noncallable(getattr(field, key)) for key in keys}
386+
return [{key: noncallable(getattr(field, key)) for key in keys}
387387
for field in self if field.readable and not field.type=='password']
388388

389389
@cachedprop
@@ -415,7 +415,7 @@ def _enable_record_versioning(self,
415415
clones.append(
416416
field.clone(unique=False, type=field.type if nfk else 'bigint')
417417
)
418-
418+
419419
d = dict(format=self._format)
420420
if migrate:
421421
d['migrate'] = migrate
@@ -427,7 +427,7 @@ def _enable_record_versioning(self,
427427
d['redefine'] = redefine
428428
archive_db.define_table(
429429
archive_name,
430-
Field(current_record, field_type, label=current_record_label),
430+
Field(current_record, field_type, label=current_record_label),
431431
*clones, **d)
432432

433433
self._before_update.append(
@@ -447,7 +447,7 @@ def _enable_record_versioning(self,
447447
self._common_filter = lambda q: reduce(
448448
AND, [query(q), newquery(q)])
449449
else:
450-
self._common_filter = newquery
450+
self._common_filter = newquery
451451

452452
def _validate(self, **vars):
453453
errors = Row()
@@ -795,7 +795,7 @@ def validate_and_insert(self, **fields):
795795
response.id = self.insert(**new_fields)
796796
return response
797797

798-
def validate_and_update(self, _key=DEFAULT, **fields):
798+
def validate_and_update(self, _key=DEFAULT, **fields):
799799
response, new_fields = self._validate_fields(fields, 'update')
800800
#: select record(s) for update
801801
if _key is DEFAULT:
@@ -891,9 +891,9 @@ def import_from_csv_file(self,
891891
null = '<NULL>',
892892
unique = 'uuid',
893893
id_offset = None, # id_offset used only when id_map is None
894-
transform = None,
894+
transform = None,
895895
validate=False,
896-
**kwargs
896+
**kwargs
897897
):
898898
"""
899899
Import records from csv file.
@@ -912,7 +912,6 @@ def import_from_csv_file(self,
912912
incrementing order.
913913
Will keep the id numbers in restored table.
914914
"""
915-
916915
if validate:
917916
inserting=self.validate_and_insert
918917
else:
@@ -925,8 +924,8 @@ def import_from_csv_file(self,
925924
if restore:
926925
self._db[self].truncate()
927926

928-
reader = csv.reader(csvfile, delimiter=delimiter,
929-
quotechar=quotechar, quoting=quoting)
927+
csvfile = csvfile.read().decode()
928+
reader = csv.reader(csvfile, delimiter=delimiter,quotechar=quotechar, quoting=quoting)
930929
colnames = None
931930
if isinstance(id_map, dict):
932931
if self._tablename not in id_map:
@@ -1287,10 +1286,10 @@ def abs(self):
12871286
return Expression(
12881287
self.db, self._dialect.aggregate, self, 'ABS', self.type)
12891288

1290-
def cast(self, cast_as, **kwargs):
1289+
def cast(self, cast_as, **kwargs):
12911290
return Expression(
12921291
self.db, self._dialect.cast, self, self._dialect.types[cast_as] % kwargs, cast_as)
1293-
1292+
12941293
def lower(self):
12951294
return Expression(
12961295
self.db, self._dialect.lower, self, None, self.type)
@@ -1614,7 +1613,7 @@ class Field(Expression, Serializable):
16141613
def __init__(self, fieldname, type='string', length=None, default=DEFAULT,
16151614
required=False, requires=DEFAULT, ondelete='CASCADE',
16161615
notnull=False, unique=False, uploadfield=True, widget=None,
1617-
label=None, comment=None,
1616+
label=None, comment=None,
16181617
writable=True, readable=True,
16191618
searchable=True, listable=True,
16201619
regex=None, options=None,

0 commit comments

Comments
 (0)