Correct test_cvs on Windows, as suggested by Raghuram Devarakonda
in issue1395. All other places in this file already use newline=''...
Also check that csv.reader is given an iterable returning strings.
diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py
index 6c1c542..f53c5ea 100644
--- a/Lib/test/test_csv.py
+++ b/Lib/test/test_csv.py
@@ -6,7 +6,7 @@
import sys
import os
import unittest
-from io import StringIO
+from io import StringIO, BytesIO
from tempfile import TemporaryFile
import csv
import gc
@@ -211,6 +211,10 @@
['ab\0c'], None, strict = 1)
self._read_test(['"ab"c'], [['abc']], doublequote = 0)
+ self.assertRaises(csv.Error, self._read_test,
+ [b'ab\0c'], None)
+
+
def test_read_eol(self):
self._read_test(['a,b'], [['a','b']])
self._read_test(['a,b\n'], [['a','b']])
@@ -375,7 +379,7 @@
class TestCsvBase(unittest.TestCase):
def readerAssertEqual(self, input, expected_result):
- with TemporaryFile("w+") as fileobj:
+ with TemporaryFile("w+", newline='') as fileobj:
fileobj.write(input)
fileobj.seek(0)
reader = csv.reader(fileobj, dialect = self.dialect)
diff --git a/Modules/_csv.c b/Modules/_csv.c
index 10cf96f..75cafb2 100644
--- a/Modules/_csv.c
+++ b/Modules/_csv.c
@@ -270,7 +270,7 @@
*target = NULL;
else if (!IS_BASESTRING(src)) {
PyErr_Format(PyExc_TypeError,
- "\"%s\" must be an string", name);
+ "\"%s\" must be a string", name);
return -1;
}
else {
@@ -793,6 +793,16 @@
"newline inside string");
return NULL;
}
+ if (!PyUnicode_Check(lineobj))
+ {
+ PyErr_Format(error_obj,
+ "Iterator should return strings, "
+ "not %.200s "
+ "(did you open the file in text mode?)",
+ lineobj->ob_type->tp_name
+ );
+ return NULL;
+ }
++self->line_num;
line = PyUnicode_AsUnicode(lineobj);
linelen = PyUnicode_GetSize(lineobj);