day08 -- 文件的光标控制、内容监测,修改及其他模式

目  录

一、文件的其他模式

  r+ 模式

with open(r'H:PycharmProjectspy_learn.txt','r+',encoding='utf-8') as f:
    print(f.readable())  # 返回True 可读
    print(f.writable())  # 返回True,可写
    #print(f.read())
    #print(f.readlines())
    f.write('再见咋住咋狗!')  # r+模式下的write实际上覆盖旧的数据,如果添加的字符与旧字符不统一会出现乱码

  w+ 模式

with open(r'H:PycharmProjectspy_learn.txt','w+',encoding='utf-8') as f1:
    print(f1.readable())
    print(f1.writable())
    # f1.write('再见杰克!')
    print(f1.read())   # ????无法读出字符,文件被清空

  a+ 模式

with open(r'H:PycharmProjectspy_learn.txt','a+',encoding='utf-8') as f1:
    print(f1.readable())  # 可读可写
    print(f1.writable())
    f1.write('再见我的哈鲁亚克
')

文件非纯净模式总结:“+”模式下均可读可写。

  “r+” 中写入字符会覆盖,并且是从文件的开头进行覆盖:原因是“r+”模式是从开头开始读取的,所以写入时也从开头起;

  “w+”中读入字符会清空文件内容,具体原因。。????和“w”模式类似都是先清空在写入

  “a+”与“a”模式一样都是尾部追加写

二、文件的光标控制

1、根据文件光标可以打印不同位置的字符:

注意:只有在rt模式下,read()括号内的整数参数才是字符的个数,除此之外都是指字节的个数

with open(r'H:PycharmProjectspy_learn.txt','r',encoding='utf-8') as f1:
    print(f1.read(4))  # read()后面整数是指接收4个字符

with open(r'H:PycharmProjectspy_learn.txt','rb') as f1:
    print(f1.read(4))  # 除了rt模式外read()后面都是指字节的个数

2、文件内光标的移动

  内置方法:f.seek( offset,whence)

      offset: 相对偏移量,光标移动的位数

      whence:光标移动的参照物。有3种模式--

          0:参照文件的开头,t和b模式下都可以用。

          1:参照光标所在的当前位置,只能在b模式下用。

          2:参照文件的末尾,只能在b模式下用。

rt模式下和rb模式下,seek() 和 read()方法对比

with open(r'H:PycharmProjectspy_learn.txt','r',encoding='utf-8') as f1:
    print(f1.read(3))
    #以文件开头为参照,移动6个字节,utf-8中3个字节代表一个中文字符,即移动两个中文字符
    f1.seek(6,0)    # seek 移动的都是字节数
    print(f1.read(1)) # 返回一个字符

with open(r'H:PycharmProjectspy_learn.txt','rb') as f1:
    print(f1.read(3))
    f1.seek(6,0)  # 光标向右移动6个字节,再打印一个字节
    print(f1.read(1))  # 返回一个字节

注意情况1:当参照 0 文件开头进行光标移动并打印后,在此执行read操作,光标默认在当前位置并进行下一次操作。

# 原文本:再见杰克wewillcome!
with open(r'H:PycharmProjectspy_learn.txt','rb') as f1: #print(f1.read(3)) f1.seek(6,0) # 光标向右移动6个字节,再打印3个字节 print(f1.read(3).decode('utf-8')) print(f1.read(3).decode('utf-8')) >>>:杰 >>>:克

注意情况2:当参照模式“2”,即文件末尾开始反向取值。

# 原文本:啦啦啦啦jason
with open(r"H:PycharmProjectspy_learn.txt", 'rb') as f:
    f.seek(-4,2)
    print(f.read())  # b'ason'

  由上面代码可以看出seek光标范围从末尾到-4的值,即打印后4个字符

注意情况3:当在“r+”模式时,在光标指定位置写入字符是替代

#一二三四jason
with open(r"H:PycharmProjectspy_learn.txt", 'r+',encoding='utf-8') as f:
    f.seek(3,0)
    f.write('')  # 一我三四jason

三、文件内容变化监测小程序

1、写日志添加时间

import time
res = time.strftime('%Y-%m-%d %X')
with open(r'test1.txt','a',encoding='utf-8') as f:
    f.write('%s egon 给我发了工资
'%res)

2、利用文件光标监测文件内容变化

#检测文件内容
with open(r'H:PycharmProjectspy_learn	est1.txt','rb') as f:
    f.seek(0,2)
    while True:
        data = f.readline()
        if data:
            print("新增的内容是:%s"%data.decode('utf-8'))

3、截断文件  f.truncate()

with open(r'test','a',encoding='utf-8') as f:
    f.truncate(6)  # 接收的字节的长度 整型
    # 保留0~6字节数 后面的全部删除(截断)  注意:要返回test文本查看截断结果,程序结果不显示

四、文件修改

文件的修改有两种方式:

第一种方式步骤如下:

  1.先将文件有硬盘读到内存(读文件)

  2.在内存中完成文件的修改(文件的替换)

  3.再覆盖原来的文件(写文件)

# 河大工商是个好地方,河大的美女农大的饭!
with open(r"test1.txt",'r',encoding='utf-8') as f:
    data = f.read()
    res = data.replace('河大','邮电')  # data 是字符串类型不可变,所以要用一个变量名来接收
    print(res)
#再写入重新覆盖原来的文件内容
with open(r"test1.txt",'w',encoding='utf-8') as f:
    f.write(res)  # 邮电工商是个好地方,邮电的美女农大的饭!

优点:硬盘中只出现一个文件,不会过多占用硬盘空间。

缺点:当文件过大时可能会导致内存溢出。

第二种文件修改方式步骤如下:

# 邮电工商是个好地方,邮电的美女农大的饭!
import os  # os 是操作系统的库

with open(r"H:PycharmProjectspy_learn	est1.txt",'r',encoding='utf-8') as f1,
    open(r'H:PycharmProjectspy_learn	est2.txt','a',encoding='utf-8') as f2:  # 注意:新文件f2 是追加写‘a’模式,因为是循环读取文件并追加写到新文件中
    for line in f1:
        new_line = line.replace('地方','学校')  # line是字符串类型不可变,需要一个变量名来接收
        f2.write(new_line)
os.remove('test1.txt')
os.rename('test2.txt','test1.txt')  # 邮电工商是个好学校,邮电的美女农大的饭!

优点:内存中始终只有一行内容,不占内存,不会导致内存溢出。

缺点:在某一时间硬盘上会同时出现两个文件夹。

五、函数简介

1、函数的定义:函数是一个工具,哪里需要哪里搬。

  函数体内代码定义截断,只检测语法,不执行代码。函数四部分如图:

2、函数的执行流程如图所示:

注意:函数体内的代码,如果不调用的话是不执行的!!!

总结函数前戏如下:

  a、函数名的命名规则和变量一样,函数就是工具,必须先定义在调用(函数名+括号)

  b、函数和变量区别:通过变量名可找到变量对应的值;通过函数名+括号,可找到函数体所对应的代码并执行

原文地址:https://www.cnblogs.com/qinsungui921112/p/11153339.html