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


    



posted @ 2020-10-15 13:14  IT小平  阅读(1374)  评论(0编辑  收藏  举报