读取文件时,如果文件过大,则一次读取全部内容到内存,容易造成内存不足,所以要对大文件进行批量的读取内容。
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(