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

  • 相关阅读:
    BZOJ2821 作诗(Poetize) 【分块】
    BZOJ2724 蒲公英 【分块】
    Codeforces 17E Palisection 【Manacher】
    BZOJ2565 最长双回文串 【Manacher】
    Codeforces 25E Test 【Hash】
    CODEVS3013 单词背诵 【Hash】【MAP】
    HDU2825 Wireless Password 【AC自动机】【状压DP】
    HDU2896 病毒侵袭 【AC自动机】
    HDU3065 病毒侵袭持续中【AC自动机】
    HDU2222 Keywords Search 【AC自动机】
  • 原文地址:https://www.cnblogs.com/qinsungui921112/p/11153339.html
Copyright © 2020-2023  润新知