diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index 9526a03b053..9de72bb725c 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -1166,7 +1166,7 @@ call fails (for example because the path doesn't exist). .. versionadded:: 3.5 -.. method:: Path.write_text(data, encoding=None, errors=None) +.. method:: Path.write_text(data, encoding=None, errors=None, newline=None) Open the file pointed to in text mode, write *data* to it, and close the file:: @@ -1182,6 +1182,9 @@ call fails (for example because the path doesn't exist). .. versionadded:: 3.5 + .. versionchanged:: 3.10 + The *newline* parameter was added. + Correspondence to tools in the :mod:`os` module ----------------------------------------------- diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 147be2ff0dd..178c5b981d8 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -1264,14 +1264,14 @@ class Path(PurePath): with self.open(mode='wb') as f: return f.write(view) - def write_text(self, data, encoding=None, errors=None): + def write_text(self, data, encoding=None, errors=None, newline=None): """ Open the file in text mode, write to it, and close the file. """ if not isinstance(data, str): raise TypeError('data must be str, not %s' % data.__class__.__name__) - with self.open(mode='w', encoding=encoding, errors=errors) as f: + with self.open(mode='w', encoding=encoding, errors=errors, newline=newline) as f: return f.write(data) def readlink(self): diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 2cb6738a295..17292dc1abf 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1510,6 +1510,26 @@ class _BasePathTest(object): self.assertRaises(TypeError, (p / 'fileA').write_text, b'somebytes') self.assertEqual((p / 'fileA').read_text(encoding='latin-1'), 'äbcdefg') + def test_write_text_with_newlines(self): + p = self.cls(BASE) + # Check that `\n` character change nothing + (p / 'fileA').write_text('abcde\r\nfghlk\n\rmnopq', newline='\n') + self.assertEqual((p / 'fileA').read_bytes(), + b'abcde\r\nfghlk\n\rmnopq') + # Check that `\r` character replaces `\n` + (p / 'fileA').write_text('abcde\r\nfghlk\n\rmnopq', newline='\r') + self.assertEqual((p / 'fileA').read_bytes(), + b'abcde\r\rfghlk\r\rmnopq') + # Check that `\r\n` character replaces `\n` + (p / 'fileA').write_text('abcde\r\nfghlk\n\rmnopq', newline='\r\n') + self.assertEqual((p / 'fileA').read_bytes(), + b'abcde\r\r\nfghlk\r\n\rmnopq') + # Check that no argument passed will change `\n` to `os.linesep` + os_linesep_byte = bytes(os.linesep, encoding='ascii') + (p / 'fileA').write_text('abcde\nfghlk\n\rmnopq') + self.assertEqual((p / 'fileA').read_bytes(), + b'abcde' + os_linesep_byte + b'fghlk' + os_linesep_byte + b'\rmnopq') + def test_iterdir(self): P = self.cls p = P(BASE) diff --git a/Misc/NEWS.d/next/Library/2020-09-30-11-05-11.bpo-23706.dHTGjF.rst b/Misc/NEWS.d/next/Library/2020-09-30-11-05-11.bpo-23706.dHTGjF.rst new file mode 100644 index 00000000000..b9a69a55e6a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-30-11-05-11.bpo-23706.dHTGjF.rst @@ -0,0 +1 @@ +Added *newline* parameter to ``pathlib.Path.write_text()``.