Skip to content

Commit 2dfdde3

Browse files
committed
fallback to repr when can't convert to native string
1 parent 23b3336 commit 2dfdde3

File tree

2 files changed

+16
-2
lines changed

2 files changed

+16
-2
lines changed

scrapy/exporters.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,9 +192,16 @@ def export_item(self, item):
192192

193193
fields = self._get_serialized_fields(item, default_value='',
194194
include_empty=True)
195-
values = [to_native_str(x) for _, x in fields]
195+
values = list(self._build_row(x for _, x in fields))
196196
self.csv_writer.writerow(values)
197197

198+
def _build_row(self, values):
199+
for s in values:
200+
try:
201+
yield to_native_str(s)
202+
except TypeError:
203+
yield to_native_str(repr(s))
204+
198205
def _write_headers_and_set_fields_to_export(self, item):
199206
if self.include_headers_line:
200207
if not self.fields_to_export:
@@ -204,7 +211,7 @@ def _write_headers_and_set_fields_to_export(self, item):
204211
else:
205212
# use fields declared in Item
206213
self.fields_to_export = list(item.fields.keys())
207-
row = [to_native_str(s) for s in self.fields_to_export]
214+
row = list(self._build_row(self.fields_to_export))
208215
self.csv_writer.writerow(row)
209216

210217

tests/test_exporters.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,13 @@ class TestItem2(Item):
237237
expected='"Mary,Paul",John\r\n',
238238
)
239239

240+
def test_join_multivalue_not_strings(self):
241+
self.assertExportResult(
242+
item=dict(name='John', friends=[4, 8]),
243+
include_headers_line=False,
244+
expected='"[4, 8]",John\r\n',
245+
)
246+
240247

241248
class XmlItemExporterTest(BaseItemExporterTest):
242249

0 commit comments

Comments
 (0)