日常小发现(一)连续两次readlines(),第二次返回值为空
今天在用py处理log的时候,突然发现一个有趣的现象!
现象:当我们用readlines()读一个文件的时候,连续调用两遍,会出现第二个list是空的现象。
例子:
file_obj = open(r"./1.txt") for i in file_obj.readlines(): print 1 for i in file_obj.readlines(): print 2 file_obj.close()
解释:此时我们会发现,2是无法打印出来的,原来py中也存在类似c/c++中考虑指针位置的问题
其实这个很好理解,当我门打开文件并遍历一遍后,文件指针自然会来到文件得最为尾端,在c/c++中我们只需将指针位置重新挪到开头即可,可是我们是python呀,怎么可以那么蠢!
解决方法:
(一)将readlines()返回得对象存储起来
例如1:
list1 = open(r"./1.txt").readlines() for i in list1: print 1 for i in list1: print 2
例如2:
file_obj = open(r"./1.txt") list1 = file_obj.readlines() for i in list1: print 1 for i in list1: print 2 file_obj.close()
(二)将文件打开两次
例如3:
with open('./1.txt', 'r') as f: for i in f.readlines(): print 1 with open('./1.txt', 'r') as f: for i in f.readlines(): print 2
例如4:
for i in open(r"./1.txt").readlines(): print 1 for i in open(r"./1.txt").readlines(): print 2
总结:前两个例子只需要对文件打开一次,后两个例子等于对文件进行了两次打开,但是四种方法都可以做到我们想要的结果。
推荐:当处理的log数据量不大的时候,个人推荐使用例2,因为只需要打开一次,之后都是对对象进行操作了。
当处理的文件很大的时候建议使用例3,因为with有神奇的用处,不但可以自动调用close()方法,还可以有保险的作用,当文件特别大,内存不够的时候,它可以自动限制每次的大小,使得程序顺利的走下去
问题:例1和例4中在这里想向大神们提出个问题,从代码量上这两种无疑少了很多,但是问题是虽然可以正常的得到我们想要的,可是文件打开之后终究是没有关闭的,因为没有file对象,导致无法调用close(),这样会造成怎样的影响?最终又是谁去处理这个问题?我的理解可能就是py的强大最终程序结束的时候自我处理了,那这样写会不会很消耗资源,更严重的是会不会导致py的内存泄露呢?目前我的认知py怎么可能内存泄漏,毕竟它那么强大。哈哈哈!!!
用心写每一篇博客