这并不总是一个好主意(或者甚至是可行的)使用readlines()
不带参数,因为它会在整个文件中读取,并可能消耗大量的内存—和做,如果你不可能没有必要一次不需要所有人,这取决于你在做什么。
所以,一种方法是使用Python 生成器函数从文件中提取所需的行或值。它们非常容易创建,基本上只需使用yield
语句返回值而不是return
。从编程的角度来看,它们之间的主要区别在于,下次调用函数时,执行将继续执行yield
语句后面的行,而不是像通常情况下从第一行开始。这意味着它们的内部状态会在后续调用之间自动保存,这使得在内部进行复杂的处理变得更加容易。
下面是一个非常简单的例子,它使用一个获取文件中您想要的数据,每次只增加一行,因此它不需要足够的内存来保存整个文件:
def read_data(filename):
with open(filename, 'rt') as file:
next(file); next(file) # ignore first two lines
value = next(file).rstrip('\n') # read what should be the first number
while value != '#extra': # not end-of-numbers marker
yield value
value = next(file).rstrip('\n')
for number in read_data('mydatafile'):
# process each number string produced
当然,你还可以收集它们放在一起放入一个列表,如果你愿意的话,像这样:
numbers = list(read_data('mydatafile'))
正如你可以看到它可能做其他有用的东西,在功能,如验证文件数据的格式或以其他方式对其进行预处理。在上面的例子中,我通过在它返回的列表的每一行中删除换行字符readlines()
来完成一些操作。通过使用yield int(value)
而不是仅仅yield value
将每个字符串值转换为整数也是微不足道的。
希望这会给你足够的想法,以确定什么是可能的,以及在决定使用什么方法来执行手头任务时所涉及的折衷。
你可以用'read = myfile.read()。splitlines()[2:-2]'几乎同时去掉换行符。 – martineau
请注意'.strip()'也会去掉任何前导/尾部空格或制表符。你可以使用'number.rstrip(“\ n”)'来避免这种情况。 (这与OP的问题无关,但可能对读者有用) – bfontaine