当前位置: 首页 > news >正文

Python Cookbook-2.14 回退输入文件到起点

任务

需要创建一个输入文件对象(数据可能来自于网络socket 或者其他输入文件句柄),此文件对象允许回退到起点,这样就可以完全读取其中所有数据。

解决方案

将文件对象封装到一个合适的类中:

将文件对象封装到一个合适的类中:
from cStringIO import StringIO
class RewindableFile(obiect):
'''封装一个文件句柄以便重定位到开始位置'''
	def __init__(self,input_file):
	#将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):
'''根据给定的字节定位。
必须:whence == 0 and offset == self.start 
'''
	if whence != 0:
		raise ValueError("whence = %r;expecting 0" %(whence,))
	if offset != 0
		raise ValueError("offset = %r;expecting %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 except at start of file")
		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):
'''根据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):
'''从文件中读取一行'''
# buffer_file中有吗?
	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):
#如果"nobuffer"被调用,而且我们也完成了对缓存文件的处理
#那就删掉缓存,把所有的东西都重定向到原来的输入文件
	if not self._use_buffer and self.buffer_file.tell() == len(self.buffer_file.getvalue()):
#为了获得尽可能高的性能,我们重新绑定了self中的所有相关方法
		for n in'seek tell read readline readlines',split():
			setattr(self,n,getattr(self.file,n,None))
		del self.buffer_file
def nobuffer(self):
'''通知 Rewindablerile,一旦缓存耗尽就停止继续使用缓存'''
	self._use_buffer = False

讨论

太长了,此处省略。

相关文章:

  • 【Linux】进程优先级 | 进程调度(三)
  • TCP/IP 5层协议簇:物理层
  • 软件工程----敏捷模型
  • 医疗UI的特殊法则:复杂数据可视化的“零错误”设计守则
  • MySQL 存储过程详解
  • 3D线上艺术展览:开启未来艺术观赏新纪元
  • 【 .sdL】具体解析方法思路和步骤
  • AGV入门基础问答
  • threeJs+vue 轻松切换几何体贴图
  • 【JAVA-数据结构】Map和Set
  • 2025-02-26 学习记录--C/C++-C语言 判断字符串S2是否在字符串S1中
  • 编写Redis开机自启动脚本
  • 《CentOS Stream 9 阿里云 yum 源修改:解锁系统更新新速度》
  • Unity百游修炼(3)——Tank_Battle(双人对战)详细制作全流程
  • Vue纷争:DefineProps 的作用是否因为DefineModel而减弱
  • 日语学习-日语知识点小记-构建基础-JLPT-N4N5阶段(12):普通(ふつう)形 :变化方式 :日常朋友家人之间对话
  • 基于SpringBoot + Spring AI + Vue的全栈AI对话系统开发全流程解析
  • 使用uniapp内置组件webview消息传递
  • Zookeeper(67) Zookeeper在HBase中的应用是什么?
  • MySQL进阶04-MVCC实现原理
  • 做网站有意思吗?/关于搜索引擎的搜索技巧
  • 商丘网站优化/快速提升网站排名
  • 建设单位网站的重要性/seo招聘
  • 南通网站建设公司/市场营销案例分析
  • 如何打开网站根目录/b站推广网站入口202
  • 青海西宁高端网站建设/项目外包平台