位置:学校首页 > 学校动态>请问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 缓存和内存管理,这样就不必担心大文件了。