]> granicus.if.org Git - python/commitdiff
(This fix is really by Jeremy)
authorGuido van Rossum <guido@python.org>
Tue, 27 Jan 1998 19:29:45 +0000 (19:29 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 27 Jan 1998 19:29:45 +0000 (19:29 +0000)
Here's my suggested replacement for gzip.py for 1.5.1.  I've
re-implemeted methods readline and readlines, added an _unread, and
tweaked read and _read.

I tried a more complicated buffer scheme for unread (using a list of
strings and string.join), but it was more complicated and slower.
This version is a lot faster than the current version and is still
pretty simple.

Lib/gzip.py

index 26d32aa2a879164da5d3b0b7e7b046b77cd601d9..3d656b927e8a855321bf82b508f359382b510ef6 100644 (file)
@@ -80,7 +80,6 @@ class GzipFile:
            self._write_gzip_header()
        elif self.mode == READ:
            self._read_gzip_header()
-           
 
     def __repr__(self):
        s = repr(self.fileobj)
@@ -161,19 +160,20 @@ class GzipFile:
     def read(self,size=None):
        if self.extrasize <= 0 and self.fileobj is None:
            return ''
-       
-       if not size:
-           # get the whole thing
+
+       readsize = 1024
+       if not size:        # get the whole thing
            try:
                while 1:
-                   self._read()
+                   self._read(readsize)
+                   readsize = readsize * 2
            except EOFError:
                size = self.extrasize
-       else:
-           # just get some more of it
+       else:               # just get some more of it
            try:
                while size > self.extrasize:
-                   self._read()
+                   self._read(readsize)
+                   readsize = readsize * 2
            except EOFError:
                pass
        
@@ -183,8 +183,15 @@ class GzipFile:
 
        return chunk
 
-    def _read(self):
-       buf = self.fileobj.read(1024)
+    def _unread(self, buf):
+       self.extrabuf = buf + self.extrabuf
+       self.extrasize = len(buf) + self.extrasize
+
+    def _read(self, size=1024):
+       try:
+           buf = self.fileobj.read(size)
+       except AttributeError:
+           raise EOFError, "Reached EOF"
        if buf == "":
            uncompress = self.decompress.flush()
            if uncompress == "":
@@ -237,21 +244,21 @@ class GzipFile:
        return 0
 
     def readline(self):
-       # XXX This function isn't implemented in a very efficient way
-       line=""
+       bufs = []
+       readsize = 100
        while 1:
-           c = self.read(1)
-           line = line + c
-           if c=='\n' or c=="": break
-       return line
+           c = self.read(readsize)
+           i = string.find(c, '\n')
+           if i >= 0 or c == '':
+               bufs.append(c[:i])
+               self._unread(c[i+1:])
+               return string.join(bufs, '')
+           bufs.append(c)
+           readsize = readsize * 2
 
     def readlines(self):
-       L=[]
-       line = self.readline()
-       while line!="":
-           L.append(line)
-           line = self.readline()
-       return L
+       buf = self.read()
+       return string.split(buf, '\n')
 
     def writelines(self, L):
        for line in L: