蚌埠达内IT培训学校

试听课 + 活动课
填写信息优先获取试听课

位置:学校首页 > 学校动态>请问python一般如何读取大文件

请问python一般如何读取大文件

请问python一般如何读取大文件

在处理大数据时,有可能会碰到好几个 G 大小的文件。如果通过一些工具(例如:NotePad++)打开它,会发生错误,无法读取任何内容。那么python如何读取大文件呢?一起来了解下吧:

python如何读取大文件1

python读取文件一般情况是利用open()函数以及read()函数来完成:

f = open(filename,'r')

f.read()

这种方法读取小文件,即读取远远大小小于内存的文件显然没有什么问题。但是如果是将一个10G大小的日志文件读取,即文件大于内存的大小,这么处理就有问题了,会造成MemoryError

... 也就是发生内存溢出。

发生这种错误的原因在于,read()方法执行操作是一次性的都读入内存中,显然文件大于内存就会报错。

解决方法:

这里发现跟read()类似的还有其他的方法:read(参数)、readline()、readlines()

(1)read(参数):通过参数指定每次读取的大小长度,这样就避免了因为文件太大读取出问题。

while True:

block = f.read(1024)

if not block:

break

(2)readline():每次读取一行

while True:

line = f.readline()

if not line:

break

(3)readlines():读取全部的行,构成一个list,通过list来对文件进行处理,但是这种方式依然会造成MemoyError

for line in f.readlines():

....

以上基本分析了python中读取文件的方法,但是总感觉不能达到python中所强调的优雅,后来发现了还有下面的解决方法:

pythonic(我理解的是很python的python代码)的解决办法:

with open(filename, 'r') as flie:

for line in file:

....

对可迭代对象file进行迭代,这样会自动的使用buffered IO以及内存管理,这样就不必担心大文件问题了。

后来,又发现了一个模块:linecache,这个模块也可以解决大文件读取的问题,并且可以指定读取哪一行,

# 输出第2行

text = linecache.getline(filename, 2)

Python怎么读取大文件2

一般的读取

读取文件,常见的方式是:

with open('filename', 'r', encoding = 'utf-8') as f:

for line in f.readlines():

do_something(line)

但是,当完成这一操作时,readlines() 方法(read() 也一样)会将整个文件加载到内存中。在文件较大时,往往会引发 MemoryError(内存溢出)。

那么,如何避免这个问题?

使用 fileinput 模块

稍微好点儿的方式是使用 fileinput 模块:

import fileinput

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

do_something(line)

调用 fileinput.input() 会按照顺序读取行,但是在读取之后不会将它们保留在内存中。

逐行读取

除此之外,也可使用 while() 循环和 readline() 来逐行读取:

with open('filename', 'r', encoding = 'utf-8') as f:

while True:

line = f.readline() # 逐行读取

if not line: # 到 EOF,返回空字符串,则终止循环

break

do_something(line)

指定每次读取的长度

有时,可能希望对每次读取的内容进行更细粒度的控制。

在这种情况下,可以使用 iter 和 yield:

def read_in_chunks(file_obj, chunk_size = 2048):

"""

逐件读取文件

默认块大小:2KB

"""

while True:

data = file_obj.read(chunk_size) # 每次读取指定的长度

if not data:

break

yield data

with open('filename', 'r', encoding = 'utf-8') as f:

for chuck in read_in_chunks(f):

do_something(chunk)

自动管理

这才是 Pythonci 的方式,既又:

with open('filename', 'r', encoding = 'utf-8') as f:

for line in f:

do_something(line)

with 语句句柄负责打开和关闭文件(包括在内部块中引发异常时),for line in f 将文件对象 f 视为一个可迭代的数据类型,会自动使用 IO 缓存和内存管理,这样就不必担心大文件了。

领取试听课
温馨提示:为不影响您的学业,来校区前请先电话或QQ咨询,方便我校安排相关的专业老师为您解答
版权所有:搜学搜课(www.soxsok.com) 技术支持:搜学搜课网