class LimitedStream ( object ):'''LimitedStream wraps another stream in order to not allow reading from it 不允许读past specified amount of bytes.'''def __init__ ( self , stream , limit , buf_size = 64 * 1024 * 1024 ):self . stream = streamself . remaining = limitself . buffer = b ''self . buf_size = buf_size
def _read_limited ( self , size = None ):if size is None or size > self . remaining :size = self . remainingif size == 0 :return b ''result = self . stream . read ( size )self . remaining -= len ( result )return result
def read ( self , size = None ):if size is None :result = self . buffer + self . _read_limited ()self . buffer = b ''
elif size < len ( self . buffer ):result = self . buffer [: size ]self . buffer = self . buffer [ size :]
else : # size >= len(self.buffer) 只能读一部分result = self . buffer + self . _read_limited ( size - len ( self . buffer ))self . buffer = b ''return result
def readline ( self , size = None ):while b ' \n ' not in self . buffer and \( size is None or len ( self . buffer ) < size ):# 直到读到 \n 为止if size :# since size is not None here, len(self.buffer) < sizechunk = self . _read_limited ( size - len ( self . buffer ))else :chunk = self . _read_limited ()
if not chunk :break
self . buffer += chunk
sio = BytesIO ( self . buffer )if size :line = sio . readline ( size )else :line = sio . readline ()
self . buffer = sio . read () # 把剩下的数据放入 bufferreturn line
django 读数据
最新推荐文章于 2023-07-04 10:39:53 发布