####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
>>>