@@ -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 :
@@ -271,6 +282,38 @@ def test_writerows_with_none(self):
271
282
fileobj .seek (0 )
272
283
self .assertEqual (fileobj .read (), 'a\r \n ""\r \n ' )
273
284
285
+ def test_write_empty_fields (self ):
286
+ self ._write_test ((), '' )
287
+ self ._write_test (['' ], '""' )
288
+ self ._write_error_test (csv .Error , ['' ], quoting = csv .QUOTE_NONE )
289
+ self ._write_test ([None ], '""' )
290
+ self ._write_error_test (csv .Error , [None ], quoting = csv .QUOTE_NONE )
291
+ self ._write_test (['' , '' ], ',' )
292
+ self ._write_test ([None , None ], ',' )
293
+
294
+ def test_write_empty_fields_space_delimiter (self ):
295
+ self ._write_test (['' ], '""' , delimiter = ' ' , skipinitialspace = False )
296
+ self ._write_test (['' ], '""' , delimiter = ' ' , skipinitialspace = True )
297
+ self ._write_test ([None ], '""' , delimiter = ' ' , skipinitialspace = False )
298
+ self ._write_test ([None ], '""' , delimiter = ' ' , skipinitialspace = True )
299
+
300
+ self ._write_test (['' , '' ], ' ' , delimiter = ' ' , skipinitialspace = False )
301
+ self ._write_test (['' , '' ], '"" ""' , delimiter = ' ' , skipinitialspace = True )
302
+ self ._write_test ([None , None ], ' ' , delimiter = ' ' , skipinitialspace = False )
303
+ self ._write_test ([None , None ], '"" ""' , delimiter = ' ' , skipinitialspace = True )
304
+
305
+ self ._write_test (['' , '' ], ' ' , delimiter = ' ' , skipinitialspace = False ,
306
+ quoting = csv .QUOTE_NONE )
307
+ self ._write_error_test (csv .Error , ['' , '' ],
308
+ delimiter = ' ' , skipinitialspace = True ,
309
+ quoting = csv .QUOTE_NONE )
310
+
311
+ self ._write_test ([None , None ], ' ' , delimiter = ' ' , skipinitialspace = False ,
312
+ quoting = csv .QUOTE_NONE )
313
+ self ._write_error_test (csv .Error , [None , None ],
314
+ delimiter = ' ' , skipinitialspace = True ,
315
+ quoting = csv .QUOTE_NONE )
316
+
274
317
def test_writerows_errors (self ):
275
318
with TemporaryFile ("w+" , encoding = "utf-8" , newline = '' ) as fileobj :
276
319
writer = csv .writer (fileobj )
@@ -372,6 +415,14 @@ def test_read_skipinitialspace(self):
372
415
[['no space' , 'space' , 'spaces' , '\t tab' ]],
373
416
skipinitialspace = True )
374
417
418
+ def test_read_space_delimiter (self ):
419
+ self ._read_test (['a b' , ' a ' , ' ' , '' ],
420
+ [['a' , '' , '' , 'b' ], ['' , '' , 'a' , '' , '' ], ['' , '' , '' ], []],
421
+ delimiter = ' ' , skipinitialspace = False )
422
+ self ._read_test (['a b' , ' a ' , ' ' , '' ],
423
+ [['a' , 'b' ], ['a' , '' ], ['' ], []],
424
+ delimiter = ' ' , skipinitialspace = True )
425
+
375
426
def test_read_bigfield (self ):
376
427
# This exercises the buffer realloc functionality and field size
377
428
# limits.
@@ -498,10 +549,10 @@ class space(csv.excel):
498
549
escapechar = "\\ "
499
550
500
551
with TemporaryFile ("w+" , encoding = "utf-8" ) as fileobj :
501
- fileobj .write ("abc def\n c1ccccc1 benzene\n " )
552
+ fileobj .write ("abc def\n c1ccccc1 benzene\n " )
502
553
fileobj .seek (0 )
503
554
reader = csv .reader (fileobj , dialect = space ())
504
- self .assertEqual (next (reader ), ["abc" , "def" ])
555
+ self .assertEqual (next (reader ), ["abc" , "" , "" , " def" ])
505
556
self .assertEqual (next (reader ), ["c1ccccc1" , "benzene" ])
506
557
507
558
def compare_dialect_123 (self , expected , * writeargs , ** kwwriteargs ):
0 commit comments