This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: seeking past the end of a file unexpected behavior
Type: Stage: resolved
Components: IO Versions: Python 3.8, Python 3.7
process
Status: closed Resolution: not a bug
Dependencies: Superseder:
Assigned To: Nosy List: christian.heimes, cotton.seed
Priority: normal Keywords:

Created on 2021-01-26 05:29 by cotton.seed, last changed 2022-04-11 14:59 by admin. This issue is now closed.

Messages (3)
msg385692 - (view) Author: Cotton Seed (cotton.seed) Date: 2021-01-26 05:29
Seeking past the end of a file with file objects does not match the same code implemented in terms of file descriptors.  Is this the intended behavior?

Smallest example I could find:

f = open('new_file', 'ab')
print(f.seek(1))
print(f.write(b'foo'))
print(f.tell())
f.close()

This program outputs: 1, 3, 4 as expected, but only creates a 3-byte file:

and creates a 3-byte file:
$ hexdump -C new_file
00000000  66 6f 6f                                          |foo|
00000003

If I use open(..., buffering=0), or flush before the tell, it outputs: 1, 3, 3.

The obvious code with file descriptors:

fd = os.open('log', os.O_WRONLY | os.O_CREAT)
print(os.lseek(fd, 1, os.SEEK_SET))
os.write(fd, b'foo')
os.close(fd)

works as expected, creating a 4-byte file.

Could this be related this issue:

https://bugs.python.org/issue36411

?
msg385693 - (view) Author: Christian Heimes (christian.heimes) * (Python committer) Date: 2021-01-26 05:38
The high level and low level variants behave the same if you pass in the same flags. You are using the append flag in "open()", but you don't pass the os.O_APPEND flag to "os.open()".

>>> import os
>>> fd = os.open('log', os.O_WRONLY | os.O_APPEND | os.O_CREAT)
>>> os.lseek(fd, 1, os.SEEK_SET)
1
>>> os.write(fd, b'foo')
3
>>> os.close(fd)
>>> os.stat('log').st_size
3

>>> fd = os.open('log2', os.O_WRONLY | os.O_CREAT)
>>> os.lseek(fd, 1, os.SEEK_SET)
1
>>> os.write(fd, b'foo')
3
>>> os.close(fd)
>>> os.stat('log2').st_size
4
msg385694 - (view) Author: Cotton Seed (cotton.seed) Date: 2021-01-26 05:48
Christian, thanks for the quick response and the clarification. I understand my mistake now.  Thanks!
History
Date User Action Args
2022-04-11 14:59:40adminsetgithub: 87194
2021-01-26 05:48:04cotton.seedsetstatus: open -> closed
resolution: not a bug
messages: + msg385694

stage: resolved
2021-01-26 05:38:32christian.heimessetnosy: + christian.heimes
messages: + msg385693
2021-01-26 05:29:12cotton.seedcreate