Python每日一练:读取大文本文件

Python每日一练:读取大文本文件

  • read(): 一次读取文件的全部内容,可以指定size去读取
  • readline(): 每次读取一行
  • readlines(): 一次读取所有内容并按行返回list

python对文件的处理无非就是open或者file那一套,打开关闭,读取写入,但是如果涉及的文件过于大了,直接read可能就直接将内存撑爆了,所以这里也给大家提供一些方案来处理。

分段式反复读取

def read_file_chunked(fr, block_size=1024):
    while True:
        chunk = fr.read(block_size)
        if not chunk:
            break
        yield chunk


if __name__ == '__main__':
    with open('test.txt', 'r', encoding='utf-8') as fr:
        for chunk in read_file_chunked(fr):
            print(chunk)

小文件可以直接调用read方法,但是如果不能确定文件大小,可以反复调用read(size)处理,针对配置文件等文本类型也可以使用readlines读取(返回列表)

fileinput模块可以对一个或多个文件中的内容进行迭代、遍历等操作

该模块的input()函数有点类似文件readlines()方法,但它是一个可迭代对象,即每次只生成一行,需要用for循环迭代。在碰到大文件的读取时,无疑效率更高效。用fileinput对文件进行循环遍历,格式化输出,查找、替换等操作,非常方便。

import fileinput

for line in fileinput.input(['test.txt']):

    print line

每次读取一行

在使用python进行大文件读取时,应该让系统来处理,使用最简单的方式,交给解释器,就管好自己的工作就行了。而with语句会自动打开和关闭文件,包括抛出一个内部块异常。他将文件对象视为一个迭代器,会自动的采用缓冲IO和内存管理,所以你不必担心大文件。

with open('test.txt', 'r', encoding='utf-8') as fr:
    for line in fr:
        print(line)
from functools import partial
def read_file_chunked(fr, block_size=1024 * 8):
    # 首先使用 partial(fr.read, block_size) 构造一个新的无需参数的函数
    # 循环将不断返回 fr.read(block_size) 调用结果,直到其为 '' 时终止
    for chunk in iter(partial(fr.read, block_size), ''):
        yield chunk