@@ -64,6 +64,7 @@ def __init__(self, filename=None, mode=None,
6464 raise ValueError , "Mode " + mode + " not supported"
6565
6666 self .fileobj = fileobj
67+ self .offset = 0
6768
6869 if self .mode == WRITE :
6970 self ._write_gzip_header ()
@@ -138,6 +139,7 @@ def write(self,data):
138139 self .size = self .size + len (data )
139140 self .crc = zlib .crc32 (data , self .crc )
140141 self .fileobj .write ( self .compress .compress (data ) )
142+ self .offset += len (data )
141143
142144 def writelines (self ,lines ):
143145 self .write (" " .join (lines ))
@@ -167,11 +169,13 @@ def read(self, size=-1):
167169 self .extrabuf = self .extrabuf [size :]
168170 self .extrasize = self .extrasize - size
169171
172+ self .offset += size
170173 return chunk
171174
172175 def _unread (self , buf ):
173176 self .extrabuf = buf + self .extrabuf
174177 self .extrasize = len (buf ) + self .extrasize
178+ self .offset -= len (buf )
175179
176180 def _read (self , size = 1024 ):
177181 if self .fileobj is None : raise EOFError , "Reached EOF"
@@ -185,7 +189,6 @@ def _read(self, size=1024):
185189 pos = self .fileobj .tell () # Save current position
186190 self .fileobj .seek (0 , 2 ) # Seek to end of file
187191 if pos == self .fileobj .tell ():
188- self .fileobj = None
189192 raise EOFError , "Reached EOF"
190193 else :
191194 self .fileobj .seek ( pos ) # Return to original position
@@ -204,7 +207,6 @@ def _read(self, size=1024):
204207 if buf == "" :
205208 uncompress = self .decompress .flush ()
206209 self ._read_eof ()
207- self .fileobj = None
208210 self ._add_read_data ( uncompress )
209211 raise EOFError , 'Reached EOF'
210212
@@ -270,6 +272,36 @@ def flush(self):
270272 def isatty (self ):
271273 return 0
272274
275+ def tell (self ):
276+ return self .offset
277+
278+ def rewind (self ):
279+ '''Return the uncompressed stream file position indicator to the
280+ beginning of the file'''
281+ if self .mode != READ :
282+ raise IOError ("Can't rewind in write mode" )
283+ self .fileobj .seek (0 )
284+ self ._new_member = 1
285+ self .extrabuf = ""
286+ self .extrasize = 0
287+ self .offset = 0
288+
289+ def seek (self , offset ):
290+ if self .mode == WRITE :
291+ if offset < self .offset :
292+ raise IOError ('Negative seek in write mode' )
293+ count = offset - self .offset
294+ for i in range (count / 1024 ):
295+ f .write (1024 * '\0 ' )
296+ self .write ((count % 1024 )* '\0 ' )
297+ elif self .mode == READ :
298+ if offset < self .offset :
299+ # for negative seek, rewind and do positive seek
300+ self .rewind ()
301+ count = offset - self .offset
302+ for i in range (count / 1024 ): self .read (1024 )
303+ self .read (count % 1024 )
304+
273305 def readline (self , size = - 1 ):
274306 if size < 0 : size = sys .maxint
275307 bufs = []
0 commit comments