002_014 Python 回退输入文件到起点

代码如下:

#encoding=utf-8


print '中国'


#回退输入文件到起点
#创建一个输入文件,如Socket 允许回到起点,这样就可以读取所有数据




from cStringIO import  StringIO


class RewindableFile(object):
    def __init__(self, input_file):
        self.file = input_file
        self.buffer_file = StringIO()
        self.at_start = True
        try:
            self.start = input_file.tell()
        except(IOError , AttributeError):
            self.start = 0
        self._use_buffer = True
            
    def seek(self, offset, whence = 0):
        if whence != 0:
            raise ValueError('whence = %r; expecting 0' %(whence,))
        if offset != self.start:
            raise ValueError("offset = %r ; excepting %s" %(offset, self.start))
        self.rewind()
    
    def rewind(self):
        self.buffer_file.seek(0)
        self.at_start = True
    
    def tell(self):
        if not self.at_start:
            raise TypeError("RewindableFile can't tell ")
        return self.start
    
    def _read(self,size):
        if size < 0:
            y = self.file.read()
            if self._use_buffer:
                self.buffer_file.write(y)
            return self.buffer_file.read() + y
        elif size == 0 :
            return ""
        x = self.buffer_file.read(size)
        if(len(x) < size):
            y = self.file.read(size - len(x))
            if self._use_buffer:
                self.buffer_file.write(y)
            return x + y
        return x
    def read(self, size = -1):
        x = self._read(size)
        
        if self.at_start and x:
            self.at_start = False
        self._check_no_buffer()
        return x
    def readline(self):
        s = self.buffer_file.readline()
        if s[-1:] == '\n':
            return s
        t = self.file.readline()
        if self._use_buffer:
            self.buffer_file.write(t)
        self._check_no_buffer()
        return s + t
    
    def readlines(self):
        return self.read().splitlines(True)
    
    def _check_no_buffer(self):        
        if not self._use_buffer and self.buffer_file.tell() == len(self.buffer_file.getvalue()):
            for n in 'seek tell read readline readlines'.split():
                setattr(self, n, getattr(self.file,n,None))
            del self.buffer_file
    
    def nobuffer(self):
        self._user_buffer = False
        




file_obj = open(r'd:\123.txt','r')
robj = RewindableFile(file_obj)
for line in robj.readlines():
    print line
robj.rewind()
for line in robj.readlines():
    print line
file_obj.close()
            
打印结果如下:

中国
1 a c c 中 国


2 a b c 中 国


1 a c c 中 国


2 a b c 中 国



你可能感兴趣的:(002_014 Python 回退输入文件到起点)