@@ -46,6 +46,20 @@ def _test_arg_valid(self, ctor, arg):
46
46
quoting = csv .QUOTE_ALL , quotechar = None )
47
47
self .assertRaises (TypeError , ctor , arg ,
48
48
quoting = csv .QUOTE_NONE , quotechar = '' )
49
+ ctor (arg , delimiter = ' ' )
50
+ ctor (arg , escapechar = ' ' )
51
+ ctor (arg , quotechar = ' ' )
52
+ ctor (arg , delimiter = '\t ' , skipinitialspace = True )
53
+ ctor (arg , escapechar = '\t ' , skipinitialspace = True )
54
+ ctor (arg , quotechar = '\t ' , skipinitialspace = True )
55
+ ctor (arg , delimiter = ' ' , skipinitialspace = True )
56
+ ctor (arg , delimiter = '^' )
57
+ ctor (arg , escapechar = '^' )
58
+ ctor (arg , quotechar = '^' )
59
+ ctor (arg , delimiter = '\x85 ' )
60
+ ctor (arg , escapechar = '\x85 ' )
61
+ ctor (arg , quotechar = '\x85 ' )
62
+ ctor (arg , lineterminator = '\x85 ' )
49
63
50
64
def test_reader_arg_valid (self ):
51
65
self ._test_arg_valid (csv .reader , [])
@@ -152,9 +166,6 @@ def _write_error_test(self, exc, fields, **kwargs):
152
166
153
167
def test_write_arg_valid (self ):
154
168
self ._write_error_test (csv .Error , None )
155
- self ._write_test ((), '' )
156
- self ._write_test ([None ], '""' )
157
- self ._write_error_test (csv .Error , [None ], quoting = csv .QUOTE_NONE )
158
169
# Check that exceptions are passed up the chain
159
170
self ._write_error_test (OSError , BadIterable ())
160
171
class BadList :
@@ -168,7 +179,6 @@ class BadItem:
168
179
def __str__ (self ):
169
180
raise OSError
170
181
self ._write_error_test (OSError , [BadItem ()])
171
-
172
182
def test_write_bigfield (self ):
173
183
# This exercises the buffer realloc functionality
174
184
bigstring = 'X' * 50000
@@ -275,6 +285,49 @@ def test_writerows_with_none(self):
275
285
fileobj .seek (0 )
276
286
self .assertEqual (fileobj .read (), 'a\r \n ""\r \n ' )
277
287
288
+
289
+ def test_write_empty_fields (self ):
290
+ self ._write_test ((), '' )
291
+ self ._write_test (['' ], '""' )
292
+ self ._write_error_test (csv .Error , ['' ], quoting = csv .QUOTE_NONE )
293
+ self ._write_test (['' ], '""' , quoting = csv .QUOTE_STRINGS )
294
+ self ._write_test (['' ], '""' , quoting = csv .QUOTE_NOTNULL )
295
+ self ._write_test ([None ], '""' )
296
+ self ._write_error_test (csv .Error , [None ], quoting = csv .QUOTE_NONE )
297
+ self ._write_error_test (csv .Error , [None ], quoting = csv .QUOTE_STRINGS )
298
+ self ._write_error_test (csv .Error , [None ], quoting = csv .QUOTE_NOTNULL )
299
+ self ._write_test (['' , '' ], ',' )
300
+ self ._write_test ([None , None ], ',' )
301
+
302
+ def test_write_empty_fields_space_delimiter (self ):
303
+ self ._write_test (['' ], '""' , delimiter = ' ' , skipinitialspace = False )
304
+ self ._write_test (['' ], '""' , delimiter = ' ' , skipinitialspace = True )
305
+ self ._write_test ([None ], '""' , delimiter = ' ' , skipinitialspace = False )
306
+ self ._write_test ([None ], '""' , delimiter = ' ' , skipinitialspace = True )
307
+
308
+ self ._write_test (['' , '' ], ' ' , delimiter = ' ' , skipinitialspace = False )
309
+ self ._write_test (['' , '' ], '"" ""' , delimiter = ' ' , skipinitialspace = True )
310
+ self ._write_test ([None , None ], ' ' , delimiter = ' ' , skipinitialspace = False )
311
+ self ._write_test ([None , None ], '"" ""' , delimiter = ' ' , skipinitialspace = True )
312
+
313
+ self ._write_test (['' , '' ], ' ' , delimiter = ' ' , skipinitialspace = False ,
314
+ quoting = csv .QUOTE_NONE )
315
+ self ._write_error_test (csv .Error , ['' , '' ],
316
+ delimiter = ' ' , skipinitialspace = True ,
317
+ quoting = csv .QUOTE_NONE )
318
+ for quoting in csv .QUOTE_STRINGS , csv .QUOTE_NOTNULL :
319
+ self ._write_test (['' , '' ], '"" ""' , delimiter = ' ' , skipinitialspace = False ,
320
+ quoting = quoting )
321
+ self ._write_test (['' , '' ], '"" ""' , delimiter = ' ' , skipinitialspace = True ,
322
+ quoting = quoting )
323
+
324
+ for quoting in csv .QUOTE_NONE , csv .QUOTE_STRINGS , csv .QUOTE_NOTNULL :
325
+ self ._write_test ([None , None ], ' ' , delimiter = ' ' , skipinitialspace = False ,
326
+ quoting = quoting )
327
+ self ._write_error_test (csv .Error , [None , None ],
328
+ delimiter = ' ' , skipinitialspace = True ,
329
+ quoting = quoting )
330
+
278
331
def test_writerows_errors (self ):
279
332
with TemporaryFile ("w+" , encoding = "utf-8" , newline = '' ) as fileobj :
280
333
writer = csv .writer (fileobj )
@@ -376,6 +429,14 @@ def test_read_skipinitialspace(self):
376
429
[['no space' , 'space' , 'spaces' , '\t tab' ]],
377
430
skipinitialspace = True )
378
431
432
+ def test_read_space_delimiter (self ):
433
+ self ._read_test (['a b' , ' a ' , ' ' , '' ],
434
+ [['a' , '' , '' , 'b' ], ['' , '' , 'a' , '' , '' ], ['' , '' , '' ], []],
435
+ delimiter = ' ' , skipinitialspace = False )
436
+ self ._read_test (['a b' , ' a ' , ' ' , '' ],
437
+ [['a' , 'b' ], ['a' , '' ], ['' ], []],
438
+ delimiter = ' ' , skipinitialspace = True )
439
+
379
440
def test_read_bigfield (self ):
380
441
# This exercises the buffer realloc functionality and field size
381
442
# limits.
@@ -502,10 +563,10 @@ class space(csv.excel):
502
563
escapechar = "\\ "
503
564
504
565
with TemporaryFile ("w+" , encoding = "utf-8" ) as fileobj :
505
- fileobj .write ("abc def\n c1ccccc1 benzene\n " )
566
+ fileobj .write ("abc def\n c1ccccc1 benzene\n " )
506
567
fileobj .seek (0 )
507
568
reader = csv .reader (fileobj , dialect = space ())
508
- self .assertEqual (next (reader ), ["abc" , "def" ])
569
+ self .assertEqual (next (reader ), ["abc" , "" , "" , " def" ])
509
570
self .assertEqual (next (reader ), ["c1ccccc1" , "benzene" ])
510
571
511
572
def compare_dialect_123 (self , expected , * writeargs , ** kwwriteargs ):
0 commit comments