读取文件时,如果文件过大,则一次读取全部内容到内存,容易造成内存不足,所以要对大文件进行批量的读取内容。

python读取大文件通常两种方法:第一种是利用yield生成器读取;第二种是:利用open()自带方法生成迭代对象,这个是一行一行的读取。

1、利用yield生成器读取

示例代码:

# import random
# 生成模拟测试数据
# for i in range(100000):
#     random_data = random.randint(1, 100)
#     data = f"num:{i}, random_num: {random_data} \n"
#     with open('data/big_data.txt', 'a', encoding='utf-8') as f:
#         f.write(data)
def read_big_file(file_path, size=1024, encoding='utf-8'):
    with open(file_path, 'r', encoding=encoding) as f:
        while True:
            part = f.read(size)
            if part:
                yield part
            else:
                return None
file_path = 'data/big_data.txt'
size = 100  # 每次读取指定大小的内容到内存,为了测试更加明显,这儿写的小一些
# 注意:以'a'追加模式下,大文件也不会占用太多内存
for part in read_big_file(file_path, size):
    with open('data/new_big_data.txt', 'a', encoding='utf-8') as w:
        w.write(part)
    print(part)
    print('*' * 100)

运行结果:

2、利用open()自带方法生成迭代对象

注意:这是一行一行的读取,在数据量比较大的时候效率是极低的。

示例代码:

# import random
# 生成模拟测试数据
# for i in range(100000):
#     random_data = random.randint(1, 100)
#     data = f"num:{i}, random_num: {random_data} \n"
#     with open('data/big_data.txt', 'a', encoding='utf-8') as f:
#         f.write(data)
file_path = 'data/big_data.txt'
new_file_path = 'data/new_big_data.txt'
with open(file_path, 'r', encoding='utf-8') as f:
    for line in f:
        print(line)
        with open(new_file_path, 'a', encoding='utf-8') as a:
            a.write(line)

运行结果:

    1) read()函数会将数据一次性读取到内存中,可通过将数据分块读取,readline()函数逐行读取;     2) 一次限制读取文件的大小,利用iter和yield来控制每次读取文件位置; # 利用生成器是可以迭代的,但只可以读取它一...
最近处理文本文档时(文件约2GB大小),出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large File Reading 的方法,本文将介绍这两种读取方法。 我们谈到“文本处理”时,我们通常是指处理的内容。Python 将文本文件的内容读入可以操作的字符串变量非常容易。文件对象提供了三个“读”方法...
f.read() 这种方法读取文件,即读取大小远远小于内存的文件显然没有什么问题。但是如果是将一个10G大小的日志文件读取,即文件大小大于内存,这么处理就有问题了,会造成MemoryError … 也就是发生内存溢出。 这里发现跟re...
今天有个朋友问了我一个问题,如何使用Python读取文件?觉得这个问题挺有意思的,就记录下来。 大部分时间我们处理小文件的时候(1g以内?),可以直接用f.read()或readlines()直接把全部内容读取到内存里面来。但当文件非常大,比如10g,100g的时候,文件的大小一般已经超出了机器的内存大小,就没法直接按小文件的方式处理了。那应该怎么办呢? 首先,选一个文件做演示,就用上一篇博客的...
python中大数据文件读取 python中经常会遇到读取文件的场景。文件较小时,我通常采用下面方法,readlines(),该方法会一次性读取文件的所有行,并将其放入list中,最后存入内存中。可想而知,当文件较大是,内存占用会非常高,甚至造成内存溢出,进程被系统kill掉。 # 读取方式一 with open(file_path, 'r+', encoding='utf-8') as f: count = 0 for line in f.readlines(): 在上面的代码中,我们使用Python 的 with 语句来打开 CSV 文件,然后使用 csv.reader() 函数创建了一个 CSV 读取器,最后使用 for 循环遍历了 CSV 文件中的每一行。 每一行都是一个列表,包含了 CSV 文件中的每一列。例如,如果 CSV 文件包含如下内容: Name, Age, Gender Alice, 20, Female Bob, 30, Male 那么在循环中,变量 row 的值会依次是: ['Name', 'Age', 'Gender'] ['Alice', '20', 'Female'] ['Bob', '30', 'Male'] 你也可以使用下标访问列表中的每一个元素,例如: name = row[0] age = row[1] gender = row[2] 另外,如果你想更方便地读取 CSV 文件中的数据,你还可以使用 pandas 库。 pandas 库提供了 read_csv() 函数,可以快速将 CSV 文件读入到一个 DataFrame 中,方便进行数据分析和处理。 示例代码如下: import pandas as pd # 读取 CSV 文件 df = pd.read_csv('data.csv') # 查看数据集的前几行 print(