• Read a large file with python


    python读取大文件

    1. 较pythonic的方法,使用with结构
      • 文件可以自动关闭
      • 异常可以在with块内处理
          with open(filename, 'rb') as f:  
              for line in f:
                  <do someting with the line>  
      

    最大的优点:对可迭代对象 f,进行迭代遍历:for line in f,会自动地使用缓冲IO(buffered IO)以及内存管理,而不必担心任何大文件的问题。

    There should be one – and preferably only one – obvious way to do it.

    1. 使用生成器generator

    如果想对每次迭代读取的内容进行更细粒度的处理,可以使用yield生成器来读取大文件

        def readInChunks(file_obj, chunkSize=2048):
            """
            Lazy function to read a file piece by piece.  
            Default chunk size: 2kB.
            """
            while True:
                data = file_obj.read(chunkSize)
                if not data:
                    break
                yield data
        f = open('bigFile')
        for chunk in readInChunks(f):
            do_something(chunk)
        f.close()
    
    1. linux下使用split命令(将一个文件根据大小或行数平均分成若干个小文件)
        wc -l BLM.txt  # 读出BLM.txt文件一共有多少行
        # 利用split进行分割
        split -l 2482 ../BLM/BLM.txt -d -a 4 BLM_
        # 将 文件 BLM.txt 分成若干个小文件,每个文件2482行(-l 2482),文件前缀为BLM_ ,系数不是字母而是数字(-d),后缀系数为四位数(-a 4)  
    
    
        # 按行数分割
        split -l 300 large_file.txt new_file_prefix
        # 文件大小分割
        split -b 10m server.log waynelog
    
        # 对文件进行合并:使用重定向,'>' 写入文件  , '>>' 追加到文件中
        cat file_prefix* > large_file
    
    

    在工作中的日常: 用户信息,log日志缓存,等都是大文件

    补充:linecache模块

    当读取一个文件的时候,python会尝试从缓存中读取文件内容,优化读取速度,提高效率,减少了I/O操作

    linecache.getline(filename, lineno) 从文件中读取第几行,注意:包含换行符
    linecache.clearcache() 清除现有的文件缓存
    linecache.checkcache(filename=None) 检查缓存内容的有效性,可能硬盘内容发生改变,更新了,如果没有参数,将检查缓存中的所有记录(entries)

        import linecache
        linecache.getline(linecache.__file__, 8)
    

    题目:
    现给一个文件400M(该文件是由/etc/passwd生成的),统计其中root字符串出现的次数

        import time
        sum = 0
        start = time.time()
        with open('file', 'r') as f:
            for i in f:
                new = i.count('root')
                sum+=new
        end = time.time()
        print(sum, end-start)
    

    :有时候这个程序比c,shell快10倍,原因就是,python会读取cache中的数据,使用缓存在内部进行优化,减少i/o,提高效率

    References : How to read a large file

  • 相关阅读:
    POJ 3308 Paratroopers
    POJ 3228 Gold Transportation
    POJ 4786 Fibonacci Tree
    POJ 2987 Firing
    Models——英语学习小技巧之四
    Linux编程环境介绍(3) -- linux下的c/c++程序开发
    怎样使用Markdown
    windows系统中的dll的作用详细解释
    解决ListView 和ScroolView 共存 listItem.measure(0, 0) 空指针
    网页添加背景音乐
  • 原文地址:https://www.cnblogs.com/panlq/p/10618852.html
Copyright © 2020-2023  润新知