In Python3, csv.writer expects a file-like object to be opened in text mode. In Python2, csv.writer expects a file-like object to be opened in binary mode.
So in Python3, use io.StringIO , and in Python2 use io.BytesIO :
import io import csv import sys PY3 = sys.version_info[0] == 3 line_as_list = [u'foo', u'bar'] encoding = 'utf-8' if PY3: writer_file = io.StringIO() else: writer_file = io.BytesIO() line_as_list = [line.encode(encoding) for line in line_as_list] writer = csv.writer(writer_file, dialect='excel', delimiter=',') writer.writerow(line_as_list) content = writer_file.getvalue() if PY3: content = content.encode(encoding) print(type(content)) print(repr(content))
In Python3, the above print code
<class 'bytes'> b'foo,bar\r\n'
In Python2, the above code prints
<type 'str'> 'foo,bar\r\n'
unutbu
source share