python读取大文件

最近在学习python的过程中接触到了python对文件的读取。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)
时间: 2024-10-06 08:39:05

python读取大文件的相关文章

python 读取大文件

要读取个大文件,文件大概是3G左右,担心read会出现内存溢出的情况,网上找了个靠谱的用法: with open(...) as f: for line in f: <do something with line> The with statement handles opening and closing the file, including if an exception is raised in the inner block. The for line in f treats the

python读取大文件的方法

python计算文件的行数和读取某一行内容的实现方法 :最简单的办法是把文件读入一个大的列表中,然后统计列表的长度.如果文件的路径是以参数的形式filepath传递的,那么只用一行代码就可以完成我们的需求了: 1.http://blog.csdn.net/shudaqi2010/article/details/54017766 2.https://www.cnblogs.com/yu-zhang/p/5949696.html 3.http://blog.csdn.net/churximi/art

python 读取大文件越来越慢(判断 key 在 map 中,千万别用 in keys())

背景: 今天乐乐姐写代码,读取一个四五百兆的文件,然后做一串的处理.结果处理了一天还没有出来结果.问题出在哪里呢? 解决: 1. 乐乐姐打印了在不同时间点的时间,直接print time() 即可.发现一个规律,执行速度是越来越慢的. 2. 为什么会越来越慢呢? 1)可能原因1,GC 的问题,有篇文章里面写,python list append 的时候会越来越慢,解决方案是禁止GC: 使用 gc.disable()和gc.enable() 2)改完上面,仍然不行,然后看到一篇文章里面写,可能是因

Python 读取大文件的方式

对于读取容量小的文件,可以使用下面的方法: with open("path", "r") as f: f.read() 但是如果文件容量很大,高达几个G或者十几个G,使用上面这种方式就容易造成内存溢出的问题,所以如果进行大容量的文件读取建议使用下面这种方式: with open("path", "r") as f: # f 是一个可迭代的文件对象 for line in f: # 以行为单位进行读取 print(line) 原

python读取大文件【一行一行读取】

with open('e:/content.txt') as f: for line in f: if '==3346628==' in line: …………

Python 读取大文件 最后几行

方法一: # -*- coding: utf-8 -*- import sys import os import string RCV_LOG = r"d:\c.txt" def get_last_n_lines(logfile, n): n = string.atoi(n) blk_size_max = 4096 n_lines = [] with open(logfile, 'rb') as fp: fp.seek(0, os.SEEK_END) cur_pos = fp.tell

3分钟学会,学会用Python正确读取大文件

文件读写属于一种常见的IO操作,由于操作系统将底层操作磁盘的接口向上封装为一种通用接口,因此Python中读写文件的基本方法和JAVA.PHP等高级编程语言一样,先请求操作系统打开一个文件描述符,通过操作系统提供的接口从这个文件对象中读取数据,或者把数据写入这个文件中,最后当文件读写操作完成后关闭文件. 需要注意的是文件读写完成后必须及时关闭文件,一方面打开的文件会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限制的,比如Linux操作系统中我们可以使用ulimit -n命令查看

php使用file函数、fseek函数读取大文件效率分析

php读取大文件可以使用file函数和fseek函数,但是二者之间效率可能存在差异,本文章向大家介绍php file函数与fseek函数实现大文件读取效率对比分析,需要的朋友可以参考一下. 1. 直接采用file函数来操作 由于 file函数是一次性将所有内容读入内存,而PHP为了防止一些写的比较糟糕的程序占用太多的内存而导致系统内存不足,使服务器出现宕机,所以默认情况下限制只能最大使用内存16M,这是通过php.ini里的 memory_limit = 16M 来进行设置,这个值如果设置-1,

Python读取txt文件

Python读取txt文件,有两种方式: (1)逐行读取 1 data=open("data.txt") 2 line=data.readline() 3 while line: 4 print line 5 line=data.readline() (2)一次全部读入内存 1 data=open("data.txt") 2 for line in data.readlines(): 3 print line