Skip to content

Commit 5c7f3bc

Browse files
authored
gh-93157: Fix fileinput didn't support errors in inplace mode (GH-95128)
1 parent a2fbc51 commit 5c7f3bc

File tree

3 files changed

+18
-3
lines changed

3 files changed

+18
-3
lines changed

Lib/fileinput.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -335,18 +335,21 @@ def _readline(self):
335335
pass
336336
# The next few lines may raise OSError
337337
os.rename(self._filename, self._backupfilename)
338-
self._file = open(self._backupfilename, self._mode, encoding=encoding)
338+
self._file = open(self._backupfilename, self._mode,
339+
encoding=encoding, errors=self._errors)
339340
try:
340341
perm = os.fstat(self._file.fileno()).st_mode
341342
except OSError:
342-
self._output = open(self._filename, self._write_mode, encoding=encoding)
343+
self._output = open(self._filename, self._write_mode,
344+
encoding=encoding, errors=self._errors)
343345
else:
344346
mode = os.O_CREAT | os.O_WRONLY | os.O_TRUNC
345347
if hasattr(os, 'O_BINARY'):
346348
mode |= os.O_BINARY
347349

348350
fd = os.open(self._filename, mode, perm)
349-
self._output = os.fdopen(fd, self._write_mode, encoding=encoding)
351+
self._output = os.fdopen(fd, self._write_mode,
352+
encoding=encoding, errors=self._errors)
350353
try:
351354
os.chmod(self._filename, perm)
352355
except OSError:

Lib/test/test_fileinput.py

+10
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,16 @@ def test_inplace_binary_write_mode(self):
326326
with open(temp_file, 'rb') as f:
327327
self.assertEqual(f.read(), b'New line.')
328328

329+
def test_inplace_encoding_errors(self):
330+
temp_file = self.writeTmp(b'Initial text \x88', mode='wb')
331+
with FileInput(temp_file, inplace=True,
332+
encoding="ascii", errors="replace") as fobj:
333+
line = fobj.readline()
334+
self.assertEqual(line, 'Initial text \ufffd')
335+
print("New line \x88")
336+
with open(temp_file, 'rb') as f:
337+
self.assertEqual(f.read().rstrip(b'\r\n'), b'New line ?')
338+
329339
def test_file_hook_backward_compatibility(self):
330340
def old_hook(filename, mode):
331341
return io.StringIO("I used to receive only filename and mode")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix :mod:`fileinput` module didn't support ``errors`` option when
2+
``inplace`` is true.

0 commit comments

Comments
 (0)