日常小发现(一)连续两次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怎么可能内存泄漏,毕竟它那么强大。哈哈哈!!!


原文链接: https://www.cnblogs.com/lijianping/p/13819533.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/204016

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午9:43
下一篇 2023年2月12日 下午9:43

相关推荐