bpo-23706: Add newline parameter to pathlib.Path.write_text (GH-22420) (GH-22420)

* Add _newline_ parameter to `pathlib.Path.write_text()`
* Update documentation of `pathlib.Path.write_text()`
* Add test case for `pathlib.Path.write_text()` calls with _newline_ parameter passed

Automerge-Triggered-By: GH:methane
This commit is contained in:
Максим 2020-10-21 05:08:19 +03:00 committed by GitHub
parent 25492a5b59
commit 5f22741340
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 27 additions and 3 deletions

View file

@ -1166,7 +1166,7 @@ call fails (for example because the path doesn't exist).
.. versionadded:: 3.5 .. 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 Open the file pointed to in text mode, write *data* to it, and close the
file:: file::
@ -1182,6 +1182,9 @@ call fails (for example because the path doesn't exist).
.. versionadded:: 3.5 .. versionadded:: 3.5
.. versionchanged:: 3.10
The *newline* parameter was added.
Correspondence to tools in the :mod:`os` module Correspondence to tools in the :mod:`os` module
----------------------------------------------- -----------------------------------------------

View file

@ -1264,14 +1264,14 @@ class Path(PurePath):
with self.open(mode='wb') as f: with self.open(mode='wb') as f:
return f.write(view) 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. Open the file in text mode, write to it, and close the file.
""" """
if not isinstance(data, str): if not isinstance(data, str):
raise TypeError('data must be str, not %s' % raise TypeError('data must be str, not %s' %
data.__class__.__name__) 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) return f.write(data)
def readlink(self): def readlink(self):

View file

@ -1510,6 +1510,26 @@ class _BasePathTest(object):
self.assertRaises(TypeError, (p / 'fileA').write_text, b'somebytes') self.assertRaises(TypeError, (p / 'fileA').write_text, b'somebytes')
self.assertEqual((p / 'fileA').read_text(encoding='latin-1'), 'äbcdefg') 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): def test_iterdir(self):
P = self.cls P = self.cls
p = P(BASE) p = P(BASE)

View file

@ -0,0 +1 @@
Added *newline* parameter to ``pathlib.Path.write_text()``.