python高效读取大文件_python 如何读取大文件

本文介绍了两种Python高效读取大文件的方法,以避免一次性加载导致的内存溢出问题。方法一是通过自定义生成器函数,每次读取固定大小的数据块;方法二是直接使用内置的文件迭代器,逐行读取文件内容。这两种方法都能够有效地处理大文件,而不会消耗过多内存。
摘要由CSDN通过智能技术生成

一般的读取文件的方法:

with open(file_path, "r") as f:

print f.read()

或者

with open(file_path,"r") as f:

for line in f.readlines():

print line

read()是一次性把文件内容以字符串的方式读到内存,放到一个字符串变量中

readlines() 是一次性读取所有内容,并按行生成一个list

因一次性读取,若文件内容过大,则会将内存爆掉。报错:“MemoryError”

读取大几G的大文件,可以利用生成器 generator

方法一: 将文件切分成小段,每次处理完小段,释放内存

def read_in_block(file_path):

BLOCK_SIZE=1024

with open(file_path,"r") as f:

while True:

block =f.read(BLOCK_SIZE) #每次读取固定长度到内存缓冲区

if block:

yield block

else:

return #如果读取到文件末尾,则退出

for block in read_in_block(file_path):

print block

// 这个方法,速度很快(只有3s),但有个问题,若满足了1024时,会将正好在1024位置的数据切开,如下

cad1a596-fe14-45c4-b920-8bc0eab38ee6

c6f0c5bf-4359-4a28-9f90-3c4f61b5e12d

3815cd95-2147-4701-8d50-273325140643

c047d057-c33d-4a69-995a-5

29cb5cb04ee

afd9cffb-09f0-4347-bf12-34485969b366

3c145a79-c72c-43db-8e68-02be8046c6b4

虽然每个block都是str, 但无法直接得到每行的id,只能再切分。

方法二 利用open("","")系统自带方法生成的迭代对象

with open(file_path) as f:

for line in f:

print line

for line in f 这种用法是把文件对象f当作迭代对象,系统将自动处理IO缓存和内存管理。

耗时较第1种方法慢一点,要25s。 但每个Line, type都是str, 都是自己需要的一行数据(一行是一个id)。

>>> f = open("dup_file - Copy (2).txt")

>>> type(f)

>>> type(f.read())

>>> f.read()

''

>>>print  f.read()

aac66f36-d2ad-4d94-9804-2220262cc354

c5a1b5ee-32b6-4912-8b90-ece3bd36d1e5

90e6509a-e918-447e-92ee-b853b9b49f15

7b7495d3-1aa5-48b5-a305-ae137d46d605

>>> f.readlines()

[]

>>> type(f.readlines())

>>> print f.readlines()

[]

>>> for i in f.readlines():

... type (i)

... print i

994761db-37fa-4243-9d13-0acd193763dd

993b2806-51fe-412d-8df2-526ea550e889

aac66f36-d2ad-4d94-9804-2220262cc354

>>> type(f.readline())

// // //

>>> f = open("dup_file - Copy (2).txt")

>>> f.readline()

'8957d983-05e2-4a54-a7b3-f1532421c7a7\n'

>>> f.readline()

'ccf30309-2a02-4d09-8ea8-70c3da8de09d\n'

>>> f.readline()

'492ddb07-e0c5-4dda-ae91-8b3700d05a79\n'

>>> f.readline()

'9cee8472-dfc1-49ac-90c3-572f68373934\n'

>>> f.readline()

''

>>> f.readline()

''

// // // 第1次调用f.readline(),没有输出或者操作,后面再也无法循环到

>>> f = open("dup_file - Copy (2).txt")

>>> type(f.readline())

>>> f.readline()

'ccf30309-2a02-4d09-8ea8-70c3da8de09d\n'

>>> f.readline()

'492ddb07-e0c5-4dda-ae91-8b3700d05a79\n'

>>> f.readline()

'9cee8472-dfc1-49ac-90c3-572f68373934\n'

>>> f.readline()

''

>>> f.readline()

// // //  使用文件对象f

>>> f = open("dup_file - Copy (2).txt")

>>> for i in f:

... type(i)

... print i

...

8957d983-05e2-4a54-a7b3-f1532421c7a7

ccf30309-2a02-4d09-8ea8-70c3da8de09d

492ddb07-e0c5-4dda-ae91-8b3700d05a79

9cee8472-dfc1-49ac-90c3-572f68373934

>>> f = open("dup_file - Copy (2).txt")

>>> for i in f.readlines():

... type(i)

... print i

...

8957d983-05e2-4a54-a7b3-f1532421c7a7

ccf30309-2a02-4d09-8ea8-70c3da8de09d

492ddb07-e0c5-4dda-ae91-8b3700d05a79

9cee8472-dfc1-49ac-90c3-572f68373934

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值