python通过生成器方式逐行读取文件内容

提示

操作文件打开的方式可能有多种,这里就不介绍了;这里只是来说明一下读取的内容如何保存。

一般来讲要保存一连串的元素,大多数常用的选择是通过列表来保存。列表有一个比较明显的缺点就是当数据量过大时,内存占用较高。

这种情况下,就可以选择生成器(generator)方式,也就是用到的时候再去读取,内存占用明显较少。下面就生成器这种方式来做简要说明。

使用最多的通过yield关键字,这里的yield关键字,你可以当作一个return的作用。这样理解可能比较容易一点。

实例

下面通过实例进行说明

import os

# 文件路径,这里设置为当前目录下的file.txt
path = 'data.txt'

def read_line_from_file(path):
    if not os.path.exists(path):
        return

    for line in open(path, 'r'):
        # 这里通过strip()函数去掉字符串两头的空白字符,否则打印行会携带换行符
        yield line.strip()

if __name__ == "__main__":
    
    for line in read_line_from_file(path):
        print(line)
  • data.txt:要读取的文件,内容设置如下
123
456
789
hello world

先看一下执行结果

图片[1]-python逐行读取文件内容
读取结果打印

说明

实质上生成器的调用是通过next()操作的,并记录上次读取的位置,下次执行next()时同记录的位置开始向后读取。

下面看一下,只读取两行

import os

# 文件路径,这里设置为当前目录下的file.txt
path = 'data.txt'

def read_line_from_file(path):
    if not os.path.exists(path):
        return

    for line in open(path, 'r'):
        yield line.strip()

if __name__ == "__main__":
    
    result = read_line_from_file(path)

    print(next(result))
    print(next(result))

结果如下

图片[2]-python逐行读取文件内容

for .... in ....里面自带next,所以可以不用显式调用next()

© 版权声明
THE END
喜欢就支持以下吧
点赞0
评论 抢沙发
Elvnik的头像-爱看否

昵称

取消
昵称表情代码图片