代码如下:
#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 中 国