如果一个函数将文本文件的名称作为输入,我可以将其重构为一个文件对象(我称之为“流”;是否有更好的词?)。优点显而易见 - 将流作为参数的函数是:
溪流有什么缺点吗?或者我应该始终将函数从文件名参数重构为流参数(当然,假设文件是纯文本的)?
答案 0 :(得分:6)
...以下是xml.etree.ElementTree
模块实现parse
函数的方式:
def parse(self, source, parser=None):
close_source = False
if not hasattr(source, "read"):
source = open(source, "rb")
close_source = True
...
由于filename是一个字符串,它没有read()
方法(此处检查该名称的任何属性);但是,打开的文件有它。这四行使得其余的代码很常见。唯一的复杂因素是您必须记住是否关闭文件对象(此处名为source
)。如果里面是open
,则必须关闭它。否则,不得关闭。
实际上,文件与sream略有不同。流通常是无限的,而文件通常不是(除非某些设备被映射为好像它是文件)。处理时的重要区别是,您永远不能立即将流读入内存。你必须通过块来处理它。
答案 1 :(得分:4)
python标准库中有许多函数接受 - 文件名或打开文件对象的字符串(我假设你将其称为“流”)。创建一个可以用来使你的函数接受任何一个的装饰器真的不难。
使用“流”的一个严重缺点是,您将其传递给您的函数,然后您的函数从中读取 - 有效地改变它的状态。根据您的计划,如果有必要,恢复该状态可能会很混乱。 (例如,您可能需要使用f.tell()
然后f.seek()
来编写代码。)