@@ -373,6 +373,7 @@ def test_read_oddinputs(self):
373
373
self .assertRaises (csv .Error , self ._read_test ,
374
374
['"ab"c' ], None , strict = 1 )
375
375
self ._read_test (['"ab"c' ], [['abc' ]], doublequote = 0 )
376
+ self ._read_test ([",,," ], [["" , "" , "" , "" ]])
376
377
377
378
self .assertRaises (csv .Error , self ._read_test ,
378
379
[b'abc' ], None )
@@ -423,6 +424,10 @@ def test_read_escape(self):
423
424
self ._read_test (['a,\0 b,c' ], [['a' , 'b' , 'c' ]], escapechar = '\0 ' )
424
425
self ._read_test (['a,\\ b,c' ], [['a' , '\\ b' , 'c' ]], escapechar = None )
425
426
self ._read_test (['a,\\ b,c' ], [['a' , '\\ b' , 'c' ]])
427
+ # '"abc\" with escapechar='\' -> ESCAPE_IN_QUOTED_FIELD + EOL -> '\n' appended
428
+ self ._read_test (['"abc\\ ' ], [["abc\n " ]], escapechar = "\\ " )
429
+ with self .assertRaises (csv .Error ):
430
+ self ._read_test (['"abc\\ ' ], None , escapechar = "\\ " , strict = True )
426
431
427
432
def test_read_quoting (self ):
428
433
self ._read_test (['1,",3,",5' ], [['1' , ',3,' , '5' ]])
@@ -513,6 +518,31 @@ def test_read_linenum(self):
513
518
self .assertRaises (StopIteration , next , r )
514
519
self .assertEqual (r .line_num , 3 )
515
520
521
+ def test_read_linenum_multiline_record (self ):
522
+ r = csv .reader (['"a' , 'b",c' , "d,e" ])
523
+ self .assertEqual (next (r ), ["ab" , "c" ])
524
+ self .assertEqual (r .line_num , 2 )
525
+ self .assertEqual (next (r ), ["d" , "e" ])
526
+ self .assertEqual (r .line_num , 3 )
527
+ with self .assertRaises (StopIteration ):
528
+ next (r )
529
+ self .assertEqual (r .line_num , 3 )
530
+
531
+ def test_read_with_unicode_delimiter_and_quotechar (self ):
532
+ self ._read_test (["αλβλγ" ], [["α" , "β" , "γ" ]], delimiter = "λ" )
533
+ self ._read_test (
534
+ ["אαאλאβאλאγא" ], [["α" , "β" , "γ" ]], delimiter = "λ" , quotechar = "א"
535
+ )
536
+
537
+ # non-BMP
538
+ delim , quote = "😂" , "😺"
539
+ self ._read_test (
540
+ [f"{ quote } a{ quote } { delim } { quote } b{ quote } " ],
541
+ [["a" , "b" ]],
542
+ delimiter = delim ,
543
+ quotechar = quote ,
544
+ )
545
+
516
546
def test_roundtrip_quoteed_newlines (self ):
517
547
rows = [
518
548
['\n a' , 'b\n c' , 'd\n ' ],
0 commit comments