• 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、函数和变量区别:通过变量名可找到变量对应的值;通过函数名+括号,可找到函数体所对应的代码并执行

  • 相关阅读:
    James 3.1服务器的安装与搭建
    Mybaits整合Spring
    动态sql
    Mybatis核心配置文件SqlMapConfig.xml
    Mapper动态代理方式
    WPF DatePicker
    UITableView(修改单元格)
    UITableView
    UIImageView
    UILabel
  • 原文地址:https://www.cnblogs.com/qinsungui921112/p/11153339.html
Copyright © 2020-2023  润新知