Kaydet (Commit) 41616ee1 authored tarafından Andrew M. Kuchling's avatar Andrew M. Kuchling

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.
üst 7e11170e
...@@ -5,10 +5,8 @@ but random access is not allowed.""" ...@@ -5,10 +5,8 @@ but random access is not allowed."""
# based on Andrew Kuchling's minigzip.py distributed with the zlib module # based on Andrew Kuchling's minigzip.py distributed with the zlib module
import time import string, struct, sys, time
import string
import zlib import zlib
import struct
import __builtin__ import __builtin__
FTEXT, FHCRC, FEXTRA, FNAME, FCOMMENT = 1, 2, 4, 8, 16 FTEXT, FHCRC, FEXTRA, FNAME, FCOMMENT = 1, 2, 4, 8, 16
...@@ -176,6 +174,7 @@ class GzipFile: ...@@ -176,6 +174,7 @@ class GzipFile:
if self._new_member: 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; # First, check if we're at the end of the file;
# if so, it's time to stop; no more members to read. # if so, it's time to stop; no more members to read.
...@@ -273,27 +272,46 @@ class GzipFile: ...@@ -273,27 +272,46 @@ class GzipFile:
def isatty(self): def isatty(self):
return 0 return 0
def readline(self): def readline(self, size=-1):
if size < 0: size = sys.maxint
bufs = [] bufs = []
readsize = 100 orig_size = size
readsize = min(100, size) # Read from the file in small chunks
while 1: while 1:
if size == 0:
return string.join(bufs, '') # Return resulting line
c = self.read(readsize) c = self.read(readsize)
i = string.find(c, '\n') 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 == '': if i >= 0 or c == '':
bufs.append(c[:i+1]) bufs.append(c[:i+1]) # Add portion of last chunk
self._unread(c[i+1:]) self._unread(c[i+1:]) # Push back rest of chunk
return string.join(bufs, '') return string.join(bufs, '') # Return resulting line
bufs.append(c)
readsize = readsize * 2
def readlines(self, ignored=None): # Append chunk to list, decrease 'size',
buf = self.read() bufs.append(c)
lines = string.split(buf, '\n') size = size - len(c)
for i in range(len(lines)-1): readsize = min(size, readsize * 2)
lines[i] = lines[i] + '\n'
if lines and not lines[-1]: def readlines(self, sizehint=0):
del lines[-1] # Negative numbers result in reading all the lines
return 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): def writelines(self, L):
for line in L: for line in L:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment