05-04 文件操作part3

一、f.seek的应用

"""
模仿:linux中的tail -f命令
	动态查看程序的变化,动态检测access.log的末尾,有没有追加新的内容,有显示到屏幕上。
	
分析:
    1、你需要有追加写日志数据的程序
    2、你需要有检测当日志数据新增了以后,打印到屏幕上的程序
    
补充:seek的三种模式,在没有移动文件指针的情况下,都可以使用
"""
# 创建一个文件用来存放追加写日志数据的代码
with open('access.log', mode='at', encoding='utf-8') as f:
    import datetime

    f.write(f'日志:{datetime.datetime.now()}'.center(50, '-') + '\n')

# 创建另一个文件用来存放当日志数据新增了以后,打印到屏幕上的代码
import time

with open('access.log', 'rb') as f:  # 注意:只要涉及到文件指针的操作,最好使用b模式操作。
    f.seek(0, 2)  # 2模式下,让光标停留在末尾。
    while True:
        res = f.readline()
        if len(res):
            print(res.decode('utf-8'))  # b模式下读文件,需要decode
        else:
            time.sleep(2)  # 定时2秒检测一次。

二、文件修改的两种方式

1、前提:对于硬盘上的数据的修改,没有改的操作,只有覆盖的操作。

"""
引入:你平时争对文件的修改,都是在内存中的修改。改完了以后,点击保存。这是你修改以后的当前所有内容会覆盖回写硬盘中。所以说所有的编辑器的修改都是覆盖行为。
"""
'''
# 文件a.txt内容如下:
张一蛋     山东    179    49    12344234523
李二蛋     河北    163    57    13913453521
王全蛋     山西    153    62    18651433422
'''
with open('a.txt', mode='r+', encoding='utf-8') as f:
    # f.seek(9, 0)
    f.seek(9)  # seek模式就是0模式,第二个参数可以不指定
    f.write('<男妇女主任>')
    
'''
# 文件a.txt内容修改以后:
张一蛋<男妇女主任>9    49    12344234523
李二蛋     河北    163    57    13913453521
王全蛋     山西    153    62    18651433422
'''    

2、文件修改方式一

"""
实现思路:将文件内容一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件
优点:在文件修改的过程中同一份数据只有一份。
缺点:过多的占用内存。
	我们来讨论,什么时候才是正真的占用内存空间呢?是执行open操作时吗?是执行f.read()操作时吗?
	解释:open打开文件的时候,只是一种发送系统调用的请求。正真修改内容是在指定f.write操作之后。
使用场景:文本编辑器(注重对用户的体验)
""""

# 1、错误示范:如果同时操作同一份文件,r读取文件、w打开文件,w会在一打开的时候就会清空该文件,这个时候,还没有进行读、写操作,原文件中的内容就没了。
'''
# 文件a.txt内容如下:
张一蛋     山东    179    49    12344234523
李二蛋     河北    163    57    13913453521
王全蛋     山西    153    62    18651433422
'''
with open('a.txt', mode='rt', encoding='utf-8') as f1, \
    open('a.txt', mode='wt', encoding='utf-8') as f2:
        pass


# 2、实现修改文件操作
# 需求:将所有dsb修改成alex
'''
# 文件c.txt内容如下:
dsb is sb
sb is dsb
egon is hahahahah
'''
with open('c.txt', mode='rt', encoding='utf-8') as f:
    res = f.read()
    data = res.replace('dsb', 'alex')
    print(data)
    
with open('c.txt', mode='wt', encoding='utf-8') as f:
    f.write(data)
'''
# 文件c.txt内容修改以后:
alex is sb
sb is alex
egon is hahahahah
'''           

3、文件修改方式二

"""
实现思路:以读的方式打开原文件,以写的方式打开一个临时文件,一行一行读取原文件内容,修改完后写入临时文件。。。,删掉原文件,将新文件重名名为原文件名。。
优点:耗费2倍硬盘空间。
缺点:节省内存空间,加载在内存中的数据,仅仅是文件的一行内容。
使用场景:开发程序时的修改文件
"""
# 需求:将所有dsb修改成alex
'''
# 文件c.txt内容如下:
dsb is sb
sb is dsb
egon is hahahahah
'''
import os
with open('c.txt', mode='rt', encoding='utf-8') as f1, \
    open('.c.txt.swap', mode='wt', encoding='utf-8') as f2:
        for line in f1:
            data = line.replace('dsb', 'alex')
            f2.write(data)
os.remove('c.txt')            
os.rename('.c.txt.swap', 'c.txt')

'''
# 文件c.txt内容修改以后:
alex is sb
sb is alex
egon is hahahahah
'''      
posted @ 2020-03-17 23:05  给你加马桶唱疏通  阅读(133)  评论(0编辑  收藏  举报