@@ -53,6 +53,36 @@ def __next__(self):
53
53
return next (self .reader ).encode ('utf-8' )
54
54
55
55
56
+ class UnicodeWriter :
57
+ """
58
+ A CSV writer which will write rows to CSV file "f",
59
+ which is encoded in the given encoding.
60
+ """
61
+
62
+ def __init__ (self , f , encoding = "utf-8" , ** kwds ):
63
+ # Redirect output to a queue
64
+ self .queue = StringIO ()
65
+ self .writer = csv .writer (self .queue , ** kwds )
66
+ self .stream = f
67
+ self .encoder = codecs .getincrementalencoder (encoding )()
68
+
69
+ def writerow (self , row ):
70
+ self .writer .writerow ([text_type (s ).encode ("utf-8" ) for s in row ])
71
+ # Fetch UTF-8 output from the queue ...
72
+ data = self .queue .getvalue ()
73
+ data = data .decode ("utf-8" )
74
+ # ... and reencode it into the target encoding
75
+ data = self .encoder .encode (data )
76
+ # write to the target stream
77
+ self .stream .write (data )
78
+ # empty queue
79
+ self .queue .truncate (0 )
80
+
81
+ def writerows (self , rows ):
82
+ for row in rows :
83
+ self .writerow (row )
84
+
85
+
56
86
class CSVSheetReader (SheetReader ):
57
87
def __init__ (self , sheet , encoding = "utf-8" ,
58
88
auto_detect_float = True , auto_detect_int = True ,
@@ -149,12 +179,7 @@ def write_row(self, array):
149
179
"""
150
180
write a row into the file
151
181
"""
152
- if PY2 :
153
- self .writer .writerow (
154
- [text_type (s if s is not None else '' ).encode (self .encoding )
155
- for s in array ])
156
- else :
157
- self .writer .writerow (array )
182
+ self .writer .writerow (array )
158
183
159
184
160
185
class CSVFileWriter (CSVSheetWriter ):
@@ -175,9 +200,12 @@ def set_sheet_name(self, name):
175
200
file_name = self .native_book
176
201
if PY2 :
177
202
self .f = open (file_name , "wb" )
203
+ self .writer = UnicodeWriter (self .f , encoding = self .encoding ,
204
+ ** self .keywords )
178
205
else :
179
- self .f = open (file_name , "w" , newline = "" )
180
- self .writer = csv .writer (self .f , ** self .keywords )
206
+ self .f = open (file_name , "w" , newline = "" ,
207
+ encoding = self .encoding )
208
+ self .writer = csv .writer (self .f , ** self .keywords )
181
209
182
210
183
211
class CSVMemoryWriter (CSVSheetWriter ):
@@ -194,8 +222,13 @@ def __init__(self, filename, name,
194
222
self .line_terminator ))
195
223
196
224
def set_sheet_name (self , name ):
197
- self .f = self .native_book
198
- self .writer = csv .writer (self .f , ** self .keywords )
225
+ if PY2 :
226
+ self .f = self .native_book
227
+ self .writer = UnicodeWriter (self .f , encoding = self .encoding ,
228
+ ** self .keywords )
229
+ else :
230
+ self .f = self .native_book
231
+ self .writer = csv .writer (self .f , ** self .keywords )
199
232
200
233
def close (self ):
201
234
if self .single_sheet_in_book :
0 commit comments