Python读取大文件

参考bobby python高级编程 第八章

通常做法

  1. 使用f.read()读取全部数据,但是对于大文件会memory error
  2. 使用按行读取的方式,实际上也会造成内存溢出
    • for line in f.readlines() 将数据存到list中

    •  while True:
           line = f.readline()
           if not line:
               break
      
    • while True:
        chunk = f.read(1024)
        if not chunk:  #表示读取到文件末尾了
            break
      

      使用read(size)的形式,指定每次读取的长度

Pythonic 的方法

with open(filename, 'rb') as f:
    for line in f:
        

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

  • 这样做仅限于读取多行的大文件,如果大文件仅有一行还是会出现内存溢出的问题

新学的方法

  • 利用read(size)的方式每次读取size个字符,同时假定一行大文件有固定的分隔符
def my_readlines(f, new_line):
    buf = ''  # 缓存每次读取的数据和 上一次读取数据分隔符后的剩余数据
    while True:
        while new_line in buf: # 判断分隔符是否出现在缓存数据中
            pos = buf.index(new_line)  # 找到分隔符的位置
            yield buf[:pos]
            buf = buf[pos + len(new_line):]
        chunk = f.read(4096*10)
        if not chunk:  # 读到了文件结尾
            yield buf   # yield最后一个分隔符后面的数据
            break
        buf += chunk

with open('test.txt', 'rb', encoding='utf-8') as f:
    for line in my_readlines(f, '#'):
        print(line)

Reference

  1. How to read large file, line by line in python

你可能感兴趣的:(Python读取大文件)