New submission from Nick Bargnesi:

Using existing file objects as arguments to the open functions in the gzip, 
bz2, and lzma libraries can cause the underlying fileobj position to get 
changed - and not quite in ways one would expect.

Calling peek against the returned file objects -- gzip.GzipFile, bz2.BZ2File, 
and lzma.LZMAFile will in one scenario advance the position of the supplied 
file object:

    >>> import bz2
    >>> fileobj = open('test.bz2', mode='rb')
    >>> bzfile = bz2.open(fileobj)
    >>>
    >>> # file positions at 0
    >>> assert fileobj.tell() == 0, bzfile.tell() == 0
    >>>
    >>> bzfile.peek()
    b'Test file.\n'
    >>> fileobj.tell()
    52

If after the initial peek, we rewind the underlying fileobj and peek again, the 
behavior changes:

    >>> fileobj.seek(0)
    0
    >>> bzfile.peek()
    b'Test file.\n'
    >>> fileobj.tell()
    0

The second scenario serves to complicate things a bit with the change in 
behavior.

I would be less surprised if the module documentation simply stated the affect 
on file position of the file object being used. Though it would be beautiful if 
the underlying file object didn't change at all. The latter seems possible 
since the three modules know whether the file object is seekable.

The gzip and lzma modules exhibit similar behavior - gzip for example:

    >>> import gzip
    >>> fileobj = open('test.gz', mode='rb')
    >>> gzfile = gzip.open(fileobj)
    >>>
    >>> # file positions at 0
    >>> assert fileobj.tell() == 0 and gzfile.tell() == 0
    >>>
    >>> gzfile.peek(1)
    b'Test file.\n'
    >>> fileobj.tell()
    36
    >>>
    >>> # rewind, and do it again
    >>> fileobj.seek(0)
    >>>
    >>> gzfile.peek(1)
    b'Test file.\n'
    >>> fileobj.tell()
    0

----------
components: Library (Lib)
messages: 192890
nosy: nbargnesi
priority: normal
severity: normal
status: open
title: gzip, bz2, lzma: peek advances file position of existing file object
type: enhancement
versions: Python 3.3

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

Reply via email to