diff --git a/Lib/_pyio.py b/Lib/_pyio.py index 76a27910da4d5f..023478aa78c6a0 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -1674,31 +1674,22 @@ def readall(self): except OSError: pass - result = bytearray(bufsize) - bytes_read = 0 + result = bytearray() while True: - if bytes_read >= bufsize: - # Parallels _io/fileio.c new_buffersize - if bufsize > 65536: - addend = bufsize >> 3 - else: - addend = bufsize + 256 - if addend < DEFAULT_BUFFER_SIZE: - addend = DEFAULT_BUFFER_SIZE - bufsize += addend - result[bytes_read:bufsize] = b'\0' - assert bufsize - bytes_read > 0, "Should always try and read at least one byte" + if len(result) >= bufsize: + bufsize = len(result) + bufsize += max(bufsize, DEFAULT_BUFFER_SIZE) + n = bufsize - len(result) try: - n = os.readinto(self._fd, memoryview(result)[bytes_read:]) + chunk = os.read(self._fd, n) except BlockingIOError: - if bytes_read > 0: + if result: break return None - if n == 0: # reached the end of the file + if not chunk: # reached the end of the file break - bytes_read += n + result += chunk - del result[bytes_read:] return bytes(result) def readinto(self, buffer): diff --git a/Misc/NEWS.d/next/Library/2025-01-28-21-22-44.gh-issue-129005.h57i9j.rst b/Misc/NEWS.d/next/Library/2025-01-28-21-22-44.gh-issue-129005.h57i9j.rst deleted file mode 100644 index c76fb05e196f87..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-01-28-21-22-44.gh-issue-129005.h57i9j.rst +++ /dev/null @@ -1,2 +0,0 @@ -``_pyio.FileIO.readall()`` now allocates, resizes, and fills a data buffer using -the same algorithm ``_io.FileIO.readall()`` uses.