如何使用Python读取1个8GB大小的文件,这个问题其实在笔试中会经常遇到的1个题目。对于在Python中读取文件的操作,一般我们会这样来操作:

2f = open('filename','rb')

f.read()

下面我们来找一个比较大的文件,比如一个Nginx日志。

这里我们找到了1个3G大小的文件。接下来,我们使用普通的读取方式来查看该文件的内容

6f=open('test','rb')

data=f.read()

---------------------------------------------------------------------------

MemoryError Traceback (most recent call last)

MemoryError:

我们可以看到1个MemoryError的错误,说明该无文件无法被装载在内存中发生溢出了。

下面我们来思考下为什么内存会溢出了,在我们打开文件的时候并没有发生任何异常,而在我们调用read方法时才出现问题。我们知道,文件对象的read方法会尝试将所有内容以1行的形式读入,显然这种方式对于大文件是不可行的。

解决方案探索

在Python中,除了使用read方法读取文件内容外,还有另外2个方法readline和readlines也可以进行内容的读取。

既然默认read方法是一次性的将内容都读取到内存中,那么我们是否可以指定其每次读取的长度来解决这个问题呢?

4data = f.read(1024)

while 1:

#处理该行的代码

data = f.read(1024)

而readlines会返回每1行读取的内容的列表,因此有一定风险的。

2for l in f.readlines():

#处理这1行的代码

那么,我们每次读取1行总可以了把。这样我们可以通过如下的方式来进行:

4line = f.readline()

while 1:

#处理该行的代码

line = f.readline()

我们通过1个无限循环的方式来进行读取。结果发现,使用readlines的方式还是会导致内存不足的情况发生,而通过读取指定字节的方式则可以处理完这个文件。

在上面的解决方案中,我们需要手动处理文件读取的大小,并在合适的情况退出读取的操作。

那么,我们有没有更好的解决方案呢?实际上是有的,在Python的手册中,有1个xreadlines的方法,这个方法就类比range和xrange函数的区别。这个方法返回类似iter(f)的字符串,但是遗憾的是该方法在Python版本2.3中已经被淘汰了,官方建议我们使用for语句来替代:

2for line in f:

#处理该行的代码

通过这种方式,Python将处理文件对象为1个迭代器,并自动使用缓存IO和内存管理,这样我们就不需要关注大的文件了。

最终解决1

3with open('test','rb') as f:

for line in f:

# 处理该行代码

或者指定读取长度

笔试问题如何使用Python读取1个8GB大小的文件,这个问题其实在笔试中会经常遇到的1个题目。对于在Python中读取文件的操作,一般我们会这样来操作:12f = open('filename','rb')f.read()下面我们来找一个比较大的文件,比如一个Nginx日志。发现问题这里我们找到了1个3G大小的文件。接下来,我们使用普通的读取方式来查看该文件的内容123456f=open('te...
首先我们看看正常的 读取 数据过程: with open('test.txt','r',encoding='utf-8') as f: #很多时候由于数据量比较大,所以并不建议一次性 读取 ,这里我们选择的是逐行一次 读取 数据 for i in f: 在 读取 数据的过程中有时候会因为某一行数据中有一些特殊字符而出现编码错误, 这里我们先看一张报错的图片: 从报错中我们可以看到这里...
最近处理文本文档时( 文件 约2GB大小),出现memoryError错误和 文件 读取 太慢的问题,后来找到了两种比较快Large File Reading 的方法,本文将介绍这两种 读取 方法。 我们谈到“文本处理”时,我们通常是指处理的内容。 Python 将文本 文件 的内容读入可以操作的字符串变量非常容易。 文件 对象提供了三个“读”方法...
今天有个朋友问了我一个问题,如何使用 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(): 对于 文件 的读写操作可参考: https://blog.csdn.net/xdc1812547560/article/details/107860396 通过read() 读取 ⽂件内容时会将⽂件中所有的内容全部 读取 出来。如果对于 读取 的⽂件⽐较⼤的话。会⼀次性的将⽂件加载到内容中。容易导致内存泄 露。所以对于较⼤的⽂件。不要直接调⽤read() read()可以接收⼀个size作为的参数。该参数⽤来指定要 读取 字符的数量。 默认值为-1,-1也就是要
要在 Python 读取 txt 文件 ,需要使用 Python 的内置函数 open() 和 read()。 首先,使用 open() 函数打开 文件 ,并指定 文件 的路径和 读取 模式('r' 表示只读)。 f = open('test.txt', 'r') 然后,使用 read() 函数 读取 文件 的内容。 content = f.read() print(content) 最后,使用 close() 函数关闭 文件 。 f.close() 也可以使用 with 语句来打开 文件 ,这样可以保证在 文件 使用完之后自动关闭 文件 。 with open('test.txt', 'r') as f: content = f.read() print(content) 在使用 read() 函数 读取 文件 内容时,也可以使用 readlines() 函数来 读取 文件 的每一行内容,并将每一行的内容存储在一个列表中。 with open('test.txt', 'r') as f: lines = f.readlines() print(lines) 在使用 readlines() 函数 读取 文件 内容时,也可以使用 for 循环来逐行 读取 文件 内容。 with open('test.txt', 'r') as f: for line in f: print(line)