From: Raymond Hettinger Date: Mon, 12 Dec 2011 06:31:09 +0000 (-0800) Subject: Issue #13573: The csv.writer now uses the repr() for floats rather than str(). X-Git-Tag: v2.7.3rc1~253 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f537702732f9107da701794782bb9f037edb1200;p=python Issue #13573: The csv.writer now uses the repr() for floats rather than str(). --- diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py index 7b16e2db64..681cfd8e85 100644 --- a/Lib/test/test_csv.py +++ b/Lib/test/test_csv.py @@ -207,6 +207,18 @@ class Test_Csv(unittest.TestCase): fileobj.close() os.unlink(name) + def test_write_float(self): + # Issue 13573: loss of precision because csv.writer + # uses str() for floats instead of repr() + orig_row = [1.234567890123, 1.0/7.0, 'abc'] + f = StringIO() + c = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC) + c.writerow(orig_row) + f.seek(0) + c = csv.reader(f, quoting=csv.QUOTE_NONNUMERIC) + new_row = next(c) + self.assertEqual(orig_row, new_row) + def _read_test(self, input, expect, **kwargs): reader = csv.reader(input, **kwargs) result = list(reader) @@ -784,7 +796,7 @@ class TestArrayWrites(unittest.TestCase): try: writer = csv.writer(fileobj, dialect="excel") writer.writerow(a) - expected = ",".join([str(i) for i in a])+"\r\n" + expected = ",".join([repr(i) for i in a])+"\r\n" fileobj.seek(0) self.assertEqual(fileobj.read(), expected) finally: @@ -800,7 +812,7 @@ class TestArrayWrites(unittest.TestCase): try: writer = csv.writer(fileobj, dialect="excel") writer.writerow(a) - expected = ",".join([str(i) for i in a])+"\r\n" + expected = ",".join([repr(i) for i in a])+"\r\n" fileobj.seek(0) self.assertEqual(fileobj.read(), expected) finally: diff --git a/Misc/NEWS b/Misc/NEWS index 6a089e373b..18196536f9 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -85,6 +85,9 @@ Library - tarfile.py: Correctly detect bzip2 compressed streams with blocksizes other than 900k. +- Issue #13573: The csv.writer now uses the repr() for floats rather than str(). + This allows floats to round-trip without loss of precision. + - Issue #13439: Fix many errors in turtle docstrings. - Issue #12856: Ensure child processes do not inherit the parent's random diff --git a/Modules/_csv.c b/Modules/_csv.c index 983f6a5043..ea3add2dbc 100644 --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -1184,7 +1184,11 @@ csv_writerow(WriterObj *self, PyObject *seq) else { PyObject *str; - str = PyObject_Str(field); + if (PyFloat_Check(field)) { + str = PyObject_Repr(field); + } else { + str = PyObject_Str(field); + } Py_DECREF(field); if (str == NULL) return NULL;