readlines、read()、readline()
等一次性读取遇到很大的文件都可能面临内存崩溃,所以我们将读取操作细化一点
1. read(size) + yield
固定每次读取的长度,使用生成器返回
def read_file1(file='articles.txt'):
time.sleep(1)
block_size = 1024
with open(file, 'r', encoding='utf-8') as f:
while True:
block = f.read(block_size)
if block:
yield block
else:
break
2. for line in
迭代遍历,这个方法会自动地使用缓冲
IO(buffered IO)
以及内存管理,但是如果大量数据都在一行还是会出状况
def read_file2(file='articles.txt'):
with open(file, 'r', encoding='utf-8') as f:
for line in f:
print(line)
3. buff机制
对于所有数据都在一行的话,用
for line in
不仅仅没法处理而且获取数据的时候也没法获取到有效内容,这一行数据里明显会包含换行符、分隔符等,这个时候我们就可以自建一个buff
管理来处理数据了,将每一次读取的内容加入缓存,对分隔符做处理后下次就从这之后依次处理
def read_file3(split_str, size, file='articles.txt', ):
with open(file, 'r', encoding='utf-8') as f:
buff = "" #定义缓冲区
while True:
print("buff:", buff)
while split_str in buff: #若分隔符在缓冲区内
print("捕捉到分隔符", buff)
position = buff.index(split_str) #查找分隔符第一次出现的索引
yield buff[:position] #返回从初始索引到次索引之间的缓冲区内容
buff = buff[position + len(split_str):] #更新缓冲区,除去分隔符以及之前的内容
chunk = f.read(size) #缓冲区内无分隔符则读取size个字符
if chunk: #读取到内容,将内容添加到缓冲区
buff += chunk
else:
yield buff #没读取到内容,退出循环
break
点击查看更多内容
1人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦