diff options
author | Andrew M. Kuchling <amk@amk.ca> | 2000-07-29 20:15:26 (GMT) |
---|---|---|
committer | Andrew M. Kuchling <amk@amk.ca> | 2000-07-29 20:15:26 (GMT) |
commit | 41616ee194e65b23fa508326d7b3788f2d63f362 (patch) | |
tree | 27912ad6a22954fa7799a1fd0f6b129b9b2c07b0 /Lib/gzip.py | |
parent | 7e11170e8531c17f3c74cbd2d243062cf3dd04bd (diff) | |
download | cpython-41616ee194e65b23fa508326d7b3788f2d63f362.zip cpython-41616ee194e65b23fa508326d7b3788f2d63f362.tar.gz cpython-41616ee194e65b23fa508326d7b3788f2d63f362.tar.bz2 |
SF patch #100740: Add optional size arguments to .readline() and
.readlines() methods. Inspired by a patch from Wolfgang Grafen,
though this version of the patch was completely rewritten from his
code.
Diffstat (limited to 'Lib/gzip.py')
-rw-r--r-- | Lib/gzip.py | 56 |
1 files changed, 37 insertions, 19 deletions
diff --git a/Lib/gzip.py b/Lib/gzip.py index 43501d4..0c9642b 100644 --- a/Lib/gzip.py +++ b/Lib/gzip.py @@ -5,10 +5,8 @@ but random access is not allowed.""" # based on Andrew Kuchling's minigzip.py distributed with the zlib module -import time -import string +import string, struct, sys, time import zlib -import struct import __builtin__ FTEXT, FHCRC, FEXTRA, FNAME, FCOMMENT = 1, 2, 4, 8, 16 @@ -175,7 +173,8 @@ class GzipFile: if self.fileobj is None: raise EOFError, "Reached EOF" if self._new_member: - # If the _new_member flag is set, we have to + # If the _new_member flag is set, we have to + # jump to the next member, if there is one. # # First, check if we're at the end of the file; # if so, it's time to stop; no more members to read. @@ -273,27 +272,46 @@ class GzipFile: def isatty(self): return 0 - def readline(self): + def readline(self, size=-1): + if size < 0: size = sys.maxint bufs = [] - readsize = 100 + orig_size = size + readsize = min(100, size) # Read from the file in small chunks while 1: + if size == 0: + return string.join(bufs, '') # Return resulting line + c = self.read(readsize) i = string.find(c, '\n') + if size is not None: + # We set i=size to break out of the loop under two + # conditions: 1) there's no newline, and the chunk is + # larger than size, or 2) there is a newline, but the + # resulting line would be longer than 'size'. + if i==-1 and len(c) > size: i=size-1 + elif size <= i: i = size -1 + if i >= 0 or c == '': - bufs.append(c[:i+1]) - self._unread(c[i+1:]) - return string.join(bufs, '') + bufs.append(c[:i+1]) # Add portion of last chunk + self._unread(c[i+1:]) # Push back rest of chunk + return string.join(bufs, '') # Return resulting line + + # Append chunk to list, decrease 'size', bufs.append(c) - readsize = readsize * 2 - - def readlines(self, ignored=None): - buf = self.read() - lines = string.split(buf, '\n') - for i in range(len(lines)-1): - lines[i] = lines[i] + '\n' - if lines and not lines[-1]: - del lines[-1] - return lines + size = size - len(c) + readsize = min(size, readsize * 2) + + def readlines(self, sizehint=0): + # Negative numbers result in reading all the lines + if sizehint <= 0: sizehint = sys.maxint + L = [] + while sizehint > 0: + line = self.readline() + if line == "": break + L.append( line ) + sizehint = sizehint - len(line) + + return L def writelines(self, L): for line in L: |