Mailing List Archive

[issue43028] seeking past the end of a file unexpected behavior
New submission from Cotton Seed <cotton.seed@gmail.com>:

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

?

----------
components: IO
messages: 385692
nosy: cotton.seed
priority: normal
severity: normal
status: open
title: seeking past the end of a file unexpected behavior
versions: Python 3.7, Python 3.8

_______________________________________
Python tracker <report@bugs.python.org>
<https://bugs.python.org/issue43028>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com
[issue43028] seeking past the end of a file unexpected behavior [ In reply to ]
Christian Heimes <lists@cheimes.de> added the comment:

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

----------
nosy: +christian.heimes

_______________________________________
Python tracker <report@bugs.python.org>
<https://bugs.python.org/issue43028>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com
[issue43028] seeking past the end of a file unexpected behavior [ In reply to ]
Cotton Seed <cotton.seed@gmail.com> added the comment:

Christian, thanks for the quick response and the clarification. I understand my mistake now. Thanks!

----------
resolution: -> not a bug
stage: -> resolved
status: open -> closed

_______________________________________
Python tracker <report@bugs.python.org>
<https://bugs.python.org/issue43028>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com