@@ -237,9 +237,11 @@ def test_write_lineterminator(self):
237
237
writer = csv .writer (sio , lineterminator = lineterminator )
238
238
writer .writerow (['a' , 'b' ])
239
239
writer .writerow ([1 , 2 ])
240
+ writer .writerow (['\r ' , '\n ' ])
240
241
self .assertEqual (sio .getvalue (),
241
242
f'a,b{ lineterminator } '
242
- f'1,2{ lineterminator } ' )
243
+ f'1,2{ lineterminator } '
244
+ f'"\r ","\n "{ lineterminator } ' )
243
245
244
246
def test_write_iterable (self ):
245
247
self ._write_test (iter (['a' , 1 , 'p,q' ]), 'a,1,"p,q"' )
@@ -455,22 +457,44 @@ def test_read_linenum(self):
455
457
self .assertEqual (r .line_num , 3 )
456
458
457
459
def test_roundtrip_quoteed_newlines (self ):
458
- with TemporaryFile ("w+" , encoding = "utf-8" , newline = '' ) as fileobj :
459
- writer = csv .writer (fileobj )
460
- rows = [['a\n b' ,'b' ],['c' ,'x\r \n d' ]]
461
- writer .writerows (rows )
462
- fileobj .seek (0 )
463
- for i , row in enumerate (csv .reader (fileobj )):
464
- self .assertEqual (row , rows [i ])
460
+ rows = [
461
+ ['\n a' , 'b\n c' , 'd\n ' ],
462
+ ['\r e' , 'f\r g' , 'h\r ' ],
463
+ ['\r \n i' , 'j\r \n k' , 'l\r \n ' ],
464
+ ['\n \r m' , 'n\n \r o' , 'p\n \r ' ],
465
+ ['\r \r q' , 'r\r \r s' , 't\r \r ' ],
466
+ ['\n \n u' , 'v\n \n w' , 'x\n \n ' ],
467
+ ]
468
+ for lineterminator in '\r \n ' , '\n ' , '\r ' :
469
+ with self .subTest (lineterminator = lineterminator ):
470
+ with TemporaryFile ("w+" , encoding = "utf-8" , newline = '' ) as fileobj :
471
+ writer = csv .writer (fileobj , lineterminator = lineterminator )
472
+ writer .writerows (rows )
473
+ fileobj .seek (0 )
474
+ for i , row in enumerate (csv .reader (fileobj )):
475
+ self .assertEqual (row , rows [i ])
465
476
466
477
def test_roundtrip_escaped_unquoted_newlines (self ):
467
- with TemporaryFile ("w+" , encoding = "utf-8" , newline = '' ) as fileobj :
468
- writer = csv .writer (fileobj ,quoting = csv .QUOTE_NONE ,escapechar = "\\ " )
469
- rows = [['a\n b' ,'b' ],['c' ,'x\r \n d' ]]
470
- writer .writerows (rows )
471
- fileobj .seek (0 )
472
- for i , row in enumerate (csv .reader (fileobj ,quoting = csv .QUOTE_NONE ,escapechar = "\\ " )):
473
- self .assertEqual (row ,rows [i ])
478
+ rows = [
479
+ ['\n a' , 'b\n c' , 'd\n ' ],
480
+ ['\r e' , 'f\r g' , 'h\r ' ],
481
+ ['\r \n i' , 'j\r \n k' , 'l\r \n ' ],
482
+ ['\n \r m' , 'n\n \r o' , 'p\n \r ' ],
483
+ ['\r \r q' , 'r\r \r s' , 't\r \r ' ],
484
+ ['\n \n u' , 'v\n \n w' , 'x\n \n ' ],
485
+ ]
486
+ for lineterminator in '\r \n ' , '\n ' , '\r ' :
487
+ with self .subTest (lineterminator = lineterminator ):
488
+ with TemporaryFile ("w+" , encoding = "utf-8" , newline = '' ) as fileobj :
489
+ writer = csv .writer (fileobj , lineterminator = lineterminator ,
490
+ quoting = csv .QUOTE_NONE , escapechar = "\\ " )
491
+ writer .writerows (rows )
492
+ fileobj .seek (0 )
493
+ for i , row in enumerate (csv .reader (fileobj ,
494
+ quoting = csv .QUOTE_NONE ,
495
+ escapechar = "\\ " )):
496
+ self .assertEqual (row , rows [i ])
497
+
474
498
475
499
class TestDialectRegistry (unittest .TestCase ):
476
500
def test_registry_badargs (self ):
0 commit comments