Open rss81 opened 10 months ago
I was able to reproduce this issue, and I'd like to work on fixing it.
I looked into the bug, and it seems like it's being caused by the TextIOWrapper
class (in both the C io
and Python pyio
modules) reading an entire chunk at a time, then not rewinding its stream pointer before performing the write.
Reproducing this example with opening a file in binary mode (as opposed to text) works as expected, rather than being buggy. The TextIOWrapper
class, which is used for text file I/O, has its own buffer it reads an entire chunk into for every read
or readline
call, and doesn't seek to the correct position when writing after reading. So I think the TextIOWrapper
class should be changed.
The simplest fix would be to essentially add self.seek(self.tell())
to both the C and Python implementations of TextIOWrapper
whenever we are writing to a stream that is readable and has a non-empty read buffer. For non-seekable streams, we may just want to leave the implementation as is (i.e. calling self.seek(self.tell())
only if the stream is seekable). The only way I see to make this bug not occur for non-seekable streams would be to change TextIOWrapper
to not buffer its read
calls if it is both readable and writable, but not seekable.
I'd be interested to hear other opinions on this.
Probably the same as Issue #82891 (and #56424, closed as not worth fixing)
Bug report
Bug description:
In python3 it seems that there is a bug with the readline() method.
I have a file txt.txt that contains two lines:
I then run the following code:
It modifies the file as expected:
I then run the following code:
I get the following:
Why is "XXX" being written to the end of the file instead of just after the first line?
If I run the following:
I get:
seems like this is a bug in readline() - it says the cursor is at 12 but writes at EOF unless I use seek()
CPython versions tested on:
3.11
Operating systems tested on:
Windows