栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python 读取大文件

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python 读取大文件

    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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/219702.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号