From 1468d25d20897f9f1b2d06eafc6cf75815f2f475 Mon Sep 17 00:00:00 2001 From: Ben Russert Date: Mon, 10 Dec 2018 22:19:44 -0700 Subject: [PATCH 1/7] TST: Add test for default line_terminator argument --- pandas/tests/io/formats/test_to_csv.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/pandas/tests/io/formats/test_to_csv.py b/pandas/tests/io/formats/test_to_csv.py index 228373a7bf545..87338d5658fce 100644 --- a/pandas/tests/io/formats/test_to_csv.py +++ b/pandas/tests/io/formats/test_to_csv.py @@ -563,3 +563,23 @@ def test_to_csv_compression(self, compression_only, result = pd.read_csv(path, index_col=0, compression=read_compression) tm.assert_frame_equal(result, df) + + + +def test_csv_formatter_line_terminator_default(monkeypatch): + # see GH #23608 + # ensure default line_terminator used is os.linesep + df = tm.makeDataFrame() + + with monkeypatch.context() as m: + # fake default os.linesep to look like windows + m.setattr(os, 'linesep', '\r\n') + assert os.linesep == '\r\n' + # import within this context so it uses the patched os.linesep + from pandas.io.formats.csvs import CSVFormatter + + formatter_with_argument = CSVFormatter(df, line_terminator='\r') + assert formatter_with_argument.line_terminator == '\r' + + formatter_with_default = CSVFormatter(df) + assert formatter_with_default.line_terminator == os.linesep \ No newline at end of file From f3deb4eb035a2a544a355ad5b464fc702f44d70d Mon Sep 17 00:00:00 2001 From: Ben Russert Date: Fri, 9 Nov 2018 16:16:19 -0700 Subject: [PATCH 2/7] BUG: Fix line_terminator option --- pandas/io/formats/csvs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/io/formats/csvs.py b/pandas/io/formats/csvs.py index 46c843af043e7..5ca47f51ede95 100644 --- a/pandas/io/formats/csvs.py +++ b/pandas/io/formats/csvs.py @@ -30,7 +30,7 @@ class CSVFormatter(object): def __init__(self, obj, path_or_buf=None, sep=",", na_rep='', float_format=None, cols=None, header=True, index=True, index_label=None, mode='w', nanRep=None, encoding=None, - compression='infer', quoting=None, line_terminator='\n', + compression='infer', quoting=None, line_terminator=None, chunksize=None, tupleize_cols=False, quotechar='"', date_format=None, doublequote=True, escapechar=None, decimal='.'): From a1d91a9a8d1daef927526633da92ea371b5f7ac3 Mon Sep 17 00:00:00 2001 From: Ben Russert Date: Mon, 10 Dec 2018 23:34:59 -0700 Subject: [PATCH 3/7] CLN: Whitespace --- pandas/tests/io/formats/test_to_csv.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pandas/tests/io/formats/test_to_csv.py b/pandas/tests/io/formats/test_to_csv.py index 87338d5658fce..482b69bfabe2d 100644 --- a/pandas/tests/io/formats/test_to_csv.py +++ b/pandas/tests/io/formats/test_to_csv.py @@ -565,7 +565,6 @@ def test_to_csv_compression(self, compression_only, tm.assert_frame_equal(result, df) - def test_csv_formatter_line_terminator_default(monkeypatch): # see GH #23608 # ensure default line_terminator used is os.linesep @@ -582,4 +581,4 @@ def test_csv_formatter_line_terminator_default(monkeypatch): assert formatter_with_argument.line_terminator == '\r' formatter_with_default = CSVFormatter(df) - assert formatter_with_default.line_terminator == os.linesep \ No newline at end of file + assert formatter_with_default.line_terminator == os.linesep From 8cf3b697c97876c6e3762dc07c71bf118f4d241b Mon Sep 17 00:00:00 2001 From: Ben Russert Date: Wed, 12 Dec 2018 22:13:11 -0700 Subject: [PATCH 4/7] CLN: review fixes --- pandas/tests/io/formats/test_to_csv.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/pandas/tests/io/formats/test_to_csv.py b/pandas/tests/io/formats/test_to_csv.py index 482b69bfabe2d..39a0eff2f8af9 100644 --- a/pandas/tests/io/formats/test_to_csv.py +++ b/pandas/tests/io/formats/test_to_csv.py @@ -568,17 +568,16 @@ def test_to_csv_compression(self, compression_only, def test_csv_formatter_line_terminator_default(monkeypatch): # see GH #23608 # ensure default line_terminator used is os.linesep - df = tm.makeDataFrame() + from pandas.io.formats.csvs import CSVFormatter + df = DataFrame() with monkeypatch.context() as m: # fake default os.linesep to look like windows m.setattr(os, 'linesep', '\r\n') assert os.linesep == '\r\n' - # import within this context so it uses the patched os.linesep - from pandas.io.formats.csvs import CSVFormatter + + formatter_with_default = CSVFormatter(DataFrame()) + assert formatter_with_default.line_terminator == os.linesep formatter_with_argument = CSVFormatter(df, line_terminator='\r') assert formatter_with_argument.line_terminator == '\r' - - formatter_with_default = CSVFormatter(df) - assert formatter_with_default.line_terminator == os.linesep From 456ec1b8ecfd3bdec3446b952c113d425c1e275d Mon Sep 17 00:00:00 2001 From: Ben Russert Date: Thu, 13 Dec 2018 22:45:17 -0700 Subject: [PATCH 5/7] TST: Use foo/bar line terminator placeholders for consistentcy across platforms --- pandas/tests/io/formats/test_to_csv.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/pandas/tests/io/formats/test_to_csv.py b/pandas/tests/io/formats/test_to_csv.py index 39a0eff2f8af9..e00aadd3e5d43 100644 --- a/pandas/tests/io/formats/test_to_csv.py +++ b/pandas/tests/io/formats/test_to_csv.py @@ -572,12 +572,11 @@ def test_csv_formatter_line_terminator_default(monkeypatch): df = DataFrame() with monkeypatch.context() as m: - # fake default os.linesep to look like windows - m.setattr(os, 'linesep', '\r\n') - assert os.linesep == '\r\n' + m.setattr(os, 'linesep', 'foo') + assert os.linesep == 'foo' - formatter_with_default = CSVFormatter(DataFrame()) + formatter_with_default = CSVFormatter(df) assert formatter_with_default.line_terminator == os.linesep - formatter_with_argument = CSVFormatter(df, line_terminator='\r') - assert formatter_with_argument.line_terminator == '\r' + formatter_with_argument = CSVFormatter(df, line_terminator='bar') + assert formatter_with_argument.line_terminator == 'bar' From f562d82c4408daaa7370d5e7c07047fc288ed973 Mon Sep 17 00:00:00 2001 From: Ben Russert Date: Fri, 14 Dec 2018 19:32:43 -0700 Subject: [PATCH 6/7] DOC: Update io docs for #21406 --- doc/source/io.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/source/io.rst b/doc/source/io.rst index 0acb0dfbee2d7..84450f78b0aef 100644 --- a/doc/source/io.rst +++ b/doc/source/io.rst @@ -1612,7 +1612,8 @@ function takes a number of arguments. Only the first is required. * ``mode`` : Python write mode, default 'w' * ``encoding``: a string representing the encoding to use if the contents are non-ASCII, for Python versions prior to 3 -* ``line_terminator``: Character sequence denoting line end (default '\\n') +* ``line_terminator``: Character sequence denoting line end. By default + this is platform specific (default ``os.linesep``) * ``quoting``: Set quoting rules as in csv module (default csv.QUOTE_MINIMAL). Note that if you have set a `float_format` then floats are converted to strings and csv.QUOTE_NONNUMERIC will treat them as non-numeric * ``quotechar``: Character used to quote fields (default '"') * ``doublequote``: Control quoting of ``quotechar`` in fields (default True) From 9897a49fb88185b08e09ee71c45063e5528e1625 Mon Sep 17 00:00:00 2001 From: Ben Russert Date: Tue, 15 Jan 2019 23:08:44 -0700 Subject: [PATCH 7/7] Remove unecessary test --- pandas/tests/io/formats/test_to_csv.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/pandas/tests/io/formats/test_to_csv.py b/pandas/tests/io/formats/test_to_csv.py index c0be8822a067e..1929817a49b3c 100644 --- a/pandas/tests/io/formats/test_to_csv.py +++ b/pandas/tests/io/formats/test_to_csv.py @@ -561,20 +561,3 @@ def test_to_csv_compression(self, compression_only, result = pd.read_csv(path, index_col=0, compression=read_compression) tm.assert_frame_equal(result, df) - - -def test_csv_formatter_line_terminator_default(monkeypatch): - # see GH #23608 - # ensure default line_terminator used is os.linesep - from pandas.io.formats.csvs import CSVFormatter - df = DataFrame() - - with monkeypatch.context() as m: - m.setattr(os, 'linesep', 'foo') - assert os.linesep == 'foo' - - formatter_with_default = CSVFormatter(df) - assert formatter_with_default.line_terminator == os.linesep - - formatter_with_argument = CSVFormatter(df, line_terminator='bar') - assert formatter_with_argument.line_terminator == 'bar'