zoukankan      html  css  js  c++  java
  • 使用生成器读取一个超大文件

    pyhon读取文件很方便,但是,如果文件很大,而且还是一行文件,那就蛋疼了. 不过还好有read(size)方法,这个方法就是每次读取size大小的数据到内存中

    下面来个示例

    def readlines(f, separator):
        '''
        读取大文件方法
        :param f:   文件句柄
        :param separator:   每一行的分隔符
        :return:
        '''
        buf = ''
        while True:
            while separator in buf:
                position = buf.index(separator)  # 分隔符的位置
                yield buf[:position]  # 切片, 从开始位置到分隔符位置
                buf = buf[position + len(separator):]  # 再切片,将yield的数据切掉,保留剩下的数据
    
            chunk = f.read(4096)  # 一次读取4096的数据到buf中
            if not chunk:  # 如果没有读到数据
                yield buf  # 返回buf中的数据
                break  # 结束
            buf += chunk  # 如果read有数据 ,将read到的数据加入到buf中
    
    
    with open('text.txt',encoding='utf-8') as f:
        for line in readlines(f,'|||'):
            # 为什么readlines函数能够使用for循环遍历呢, 因为这个函数里面有yield关键字呀, 有它就是一个生成器函数 ......
            print(line)

    测试文件text.txt

    fgshfsljflsjfls|||fyhdiyfdfhn|||fudofdb钦铁杆jdlfdl|||tedsthfdskfdk

    打印结果

    fgshfsljflsjfls
    fyhdiyfdfhn
    fudofdb钦铁杆jdlfdl
    tedsthfdskfdk
  • 相关阅读:
    Android调用WebService
    webKit和chromium的文章地址
    关注web前端
    第三次面向对象程序设计作业
    第二次面向对象程序设计作业
    面向对象程序作业一
    HashMap的存储原理
    关于MySql中使用IFNULL()函数失效的问题。
    利用反射操作bean的属性和方法
    几种String对象方法的区别
  • 原文地址:https://www.cnblogs.com/z-qinfeng/p/12052007.html
Copyright © 2011-2022 走看看