@@ -32,7 +32,6 @@ def __init__(
32
32
self .optional_fields = self ._get_optional_fields ()
33
33
self .field_mapping = {}
34
34
35
-
36
35
self .reader = csv .DictReader (
37
36
f , fieldnames , restkey , restval , dialect , * args , ** kwds
38
37
)
@@ -60,19 +59,19 @@ def _get_default_value(self, field):
60
59
)
61
60
62
61
def _get_possible_keys (self , fieldname , row ):
63
- possible_keys = list (
64
- filter (lambda x : x .strip () == fieldname , row .keys ())
65
- )
62
+ possible_keys = list (filter (lambda x : x .strip () == fieldname , row .keys ()))
66
63
if possible_keys :
67
64
return possible_keys [0 ]
68
65
69
66
def _get_value (self , row , field ):
67
+ is_field_mapped = False
68
+
70
69
try :
71
- key = (
72
- field . name
73
- if field . name not in self .field_mapping .keys ( )
74
- else self . field_mapping . get ( field . name )
75
- )
70
+ if field . name in self . field_mapping . keys ():
71
+ is_field_mapped = True
72
+ key = self .field_mapping .get ( field . name )
73
+ else :
74
+ key = field . name
76
75
77
76
if key in row .keys ():
78
77
value = row [key ]
@@ -85,14 +84,15 @@ def _get_value(self, row, field):
85
84
if field .name in self .optional_fields :
86
85
return self ._get_default_value (field )
87
86
else :
88
- raise KeyError (
89
- f'The value `{ field .name } ` is missing in the CSV file.'
90
- )
87
+ keyerror_message = f'The value for the column `{ field .name } ` is missing in the CSV file.'
88
+ if is_field_mapped :
89
+ keyerror_message = f'The value for the mapped column `{ key } ` is missing in the CSV file'
90
+ raise KeyError (keyerror_message )
91
91
else :
92
92
if not value and field .name in self .optional_fields :
93
93
return self ._get_default_value (field )
94
94
elif not value and field .name not in self .optional_fields :
95
- raise ValueError (( f'The field `{ field .name } ` is required.' ) )
95
+ raise ValueError (f'The field `{ field .name } ` is required.' )
96
96
elif (
97
97
value
98
98
and field .type is str
@@ -144,9 +144,7 @@ def _process_row(self, row):
144
144
try :
145
145
value = self ._get_value (row , field )
146
146
except ValueError as ex :
147
- raise CsvValueError (
148
- ex , line_number = self .reader .line_num
149
- ) from None
147
+ raise CsvValueError (ex , line_number = self .reader .line_num ) from None
150
148
151
149
if not value and field .default is None :
152
150
values .append (None )
@@ -161,19 +159,15 @@ def _process_row(self, row):
161
159
or '__origin__' in field_type .__dict__
162
160
and field_type .__origin__ is Union
163
161
):
164
- real_types = [
165
- t for t in field_type .__args__ if t is not type (None )
166
- ]
162
+ real_types = [t for t in field_type .__args__ if t is not type (None )]
167
163
if len (real_types ) == 1 :
168
164
field_type = real_types [0 ]
169
165
170
166
if field_type is datetime :
171
167
try :
172
168
transformed_value = self ._parse_date_value (field , value )
173
169
except ValueError as ex :
174
- raise CsvValueError (
175
- ex , line_number = self .reader .line_num
176
- ) from None
170
+ raise CsvValueError (ex , line_number = self .reader .line_num ) from None
177
171
else :
178
172
values .append (transformed_value )
179
173
continue
@@ -186,9 +180,7 @@ def _process_row(self, row):
186
180
else strtobool (str (value ).strip ()) == 1
187
181
)
188
182
except ValueError as ex :
189
- raise CsvValueError (
190
- ex , line_number = self .reader .line_num
191
- ) from None
183
+ raise CsvValueError (ex , line_number = self .reader .line_num ) from None
192
184
else :
193
185
values .append (transformed_value )
194
186
continue
@@ -219,7 +211,5 @@ def map(self, csv_fieldname):
219
211
:param csv_fieldname: The name of the CSV field
220
212
"""
221
213
return FieldMapper (
222
- lambda property_name : self ._add_to_mapping (
223
- property_name , csv_fieldname
224
- )
214
+ lambda property_name : self ._add_to_mapping (property_name , csv_fieldname )
225
215
)
0 commit comments