python读取超大文件-python读取超大文件

####1

一般的python教程讲到读文件对象时候,都会用到的三个方法:

(甚至我的本科毕业设计用的就是readlines(),现在终于知道问什么那么卡了...)

fileObj.read()

fileObj.readline()

fileObj.readlines()

现在遇到一个1.96G的二进制文件起初操作失败:

"文件对象打开"读模式"(三种基本方法)读文件时候直接获取为"Null""

open("bigfile.txt","r")

"文件对象打开"二进制读模式"(三种基本方法)读文件时候直接内存不足"

open("bigfile.txt","rb")

所以要换思路了,查阅资料终于问提(question)解决,原来距离柳暗花明只有峰回路转之近。

read()#所有数据读成一个字符串

readline()#只读取一行(以" "结尾)

readlines()#所有行读到一个list

"以上方法:将全部内容读到内存"

####2

神方法!!!(我以前竟然没用过...)

file.xreadlines()则直接返回一个iter(file)迭代器,在Python 2.3之后已经不推荐这种表示方法了;

但我这次就先用着。(当时可能就是看了这句话就一直没用...)

import time

fp = open("bigfile.txt","rb")

fpw = open("wbfile.txt","w")

i=0

st = time.time()

print st

for line in fp.xreadlines():

i+=1

#print i,line

fpw.writelines(line.strip()+" ")

fp.close()

fpw.close()

print i #行数

print time.time() - st #运行时间(s)

>>>

1450166162.47

92801805

457.281000137

>>>

"说明:原文件和写后的文件大小几乎一样,都是1.96G"

####3

然而,从Python 2.3开始,Python中的文件类型开始支持迭代功能,比如下面两段代码做的其实差不多:

with open("foo.txt", "r") as f:

for line in f.xreadlines():

# do_something(line)

with open("foo.txt", "r") as f:

for line in f:

# do_something(line)

但是,后面一种迭代占用更小的内存,而且更加智能(依赖于Python文件对象的实现),所需文件内容是自动从buffer中按照需要读取的,是值得鼓励的做法。

最后,将上面代码循环替换成下面,结果你们自己看:

with fp as f:

for line in f:

i+=1

fpw.writelines(line.strip()+" ")

>>>

1450169290.92

92801805

440.017999887

>>>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值