New submission from switchnode:

Consider the script:

$ cat nop.py
#!/usr/bin/env python
import fileinput
srt = fileinput.input(inplace=True)
print(srt.readline(), end='')
for line in srt:
        print(line, end='')

Called on text files, it will do nothing.

$ ls -alh test.*
-rw-r--r-- 1 501 utmp 1.3G Jun 18 22:17 test.mp4
-rw-r--r-- 1 501 utmp  71K Jun 18  2017 test.srt
$ ./nop.py test.srt
$ ls -alh test.*
-rw-r--r-- 1 501 utmp 1.3G Jun 18 22:17 test.mp4
-rw-r--r-- 1 501 utmp  71K Jun 18  2017 test.srt

However, if the user accidentally supplies the filename of a video instead of 
the associated srt...

$ ./nop.py test.mp4
Traceback (most recent call last):
  File "./nop.py", line 4, in <module>
    print(srt.readline(), end='')
  File "/usr/lib/python3.6/fileinput.py", line 299, in readline
    line = self._readline()
  File "/usr/lib/python3.6/fileinput.py", line 364, in _readline
    return self._readline()
  File "/usr/lib/python3.6/codecs.py", line 321, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa3 in position 43: 
invalid start byte
$ ls -alh test.*
-rw-r--r-- 1 501 utmp    0 Jun 18  2017 test.mp4
-rw-r--r-- 1 501 utmp  71K Jun 18  2017 test.srt
$ ls -alh * | grep 'bak'
$

Oops! It is gone.

I'm not sure why this happens. (Without the context-manager syntax, I would 
expect the program to end by excepting, fail to close the FileInput, and leave 
the backup file behind—certainly that would be the merciful option.)

----------
messages: 296304
nosy: switchnode
priority: normal
severity: normal
status: open
title: fileinput inplace clobbers file without leaving backup on decode errors
type: behavior
versions: Python 3.6

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue30700>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to