• Day11


    操作文件的方法

    文件操作模式:

        # r只读模式: 在文件不存在时则报错,文件存在文件内指针直接跳到文件开头
           with open('a.txt',mode='r',encoding='utf-8') as f:
               res=f.read() # 会将文件的内容由硬盘全部读入内存,赋值给res
        # w只写模式: 在文件不存在时会创建空文档,文件存在会清空文件,文件指针跑到文件开头
          with open('b.txt',mode='w',encoding='utf-8') as f:
              f.write('你好\n')
              f.write('我好\n') 
              f.write('大家好\n')
              f.write('111\n222\n333\n')
        #强调:
          # 1 在文件不关闭的情况下,连续的写入,后写的内容一定跟在前写内容的后面
          # 2 如果重新以w模式打开文件,则会清空文件内容
        # a只追加写模式: 在文件不存在时会创建空文档,文件存在会将文件指针直接移动到文件末尾
           with open('c.txt',mode='a',encoding='utf-8') as f:
               f.write('44444\n')
               f.write('55555\n')
        #强调 w 模式与 a 模式的异同:
        # 1 相同点:在打开的文件不关闭的情况下,连续的写入,新写的内容总会跟在前写的内容之后
        # 2 不同点:以 a 模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后

      控制文件读写内容的模式:

        大前提: tb模式均不能单独使用,必须与r/w/a之一结合使用
        t(默认的):文本模式
            1. 读写文件都是以字符串为单位的
            2. 只能针对文本文件
            3. 必须指定encoding参数
        b:二进制模式:
           1.读写文件都是以bytes/二进制为单位的
           2. 可以针对所有文件
           3. 一定不能指定encoding参数

      需要掌握的:

        # 读操作
        f.read()  # 读取所有内容,执行完该操作后,文件指针会移动到文件末尾
        f.readline()  # 读取一行内容,光标移动到第二行首部
        f.readlines()  # 读取每一行内容,存放于列表中
    
        # 强调:
        # f.read()与f.readlines()都是将内容一次性读入内容,如果内容过大会导致内存溢出,若还想将内容全读入内存,则必须分多次读入,有两种实现方式:
        # 方式一
        with open('a.txt',mode='rt',encoding='utf-8') as f:
            for line in f:
                print(line) # 同一时刻只读入一行内容到内存中
    
        # 方式二
        with open('1.mp4',mode='rb') as f:
            while True:
                data=f.read(1024) # 同一时刻只读入1024个Bytes到内存中
                if len(data) == 0:
                    break
                print(data)
    
        # 写操作
        f.write('1111\n222\n')  # 针对文本模式的写,需要自己写换行符
        f.write('1111\n222\n'.encode('utf-8'))  # 针对b模式的写,需要自己写换行符
        f.writelines(['333\n','444\n'])  # 文件模式
        f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式

      需要了解的:

        f.readable()  # 文件是否可读
        f.writable()  # 文件是否可读
        f.closed  # 文件是否关闭
        f.encoding  # 如果文件打开模式为b,则没有该属性
        f.flush()  # 立刻将文件内容从内存刷到硬盘
        f.name

      文件内指针的移动:

        #大前提:文件内指针的移动都是Bytes为单位的,唯一例外的是t模式下的read(n),n以字符为单位
        with open('a.txt',mode='rt',encoding='utf-8') as f:
             data=f.read(3) # 读取3个字符
    
    
        with open('a.txt',mode='rb') as f:
             data=f.read(3) # 读取3个Bytes
    
    
        # 之前文件内指针的移动都是由读/写操作而被动触发的,若想读取文件某一特定位置的数据,则则需要用f.seek方法主动控制文件内指针的移动,详细用法如下:
        # f.seek(指针移动的字节数,模式控制): 
        # 模式控制:
        # 0: 默认的模式,该模式代表指针移动的字节数是以文件开头为参照的
        # 1: 该模式代表指针移动的字节数是以当前所在的位置为参照的
        # 2: 该模式代表指针移动的字节数是以文件末尾的位置为参照的
        # 强调:其中0模式可以在t或者b模式使用,而1跟2模式只能在b模式下用

        案例:

          #0模式
        
          with open('a.txt',mode='rt',encoding='utf-8') as f:
              f.seek(3,0)     # 参照文件开头移动了3个字节
              print(f.tell()) # 查看当前文件指针距离文件开头的位置,输出结果为3
              print(f.read()) # 从第3个字节的位置读到文件末尾
              # 注意:由于在t模式下,会将读取的内容自动解码,所以必须保证读取的内容是一个完整中文数据,否则解码失败

          #1模式
          with open('a.txt',mode='rb') as f:
              f.seek(3,1) # 从当前位置往后移动3个字节,而此时的当前位置就是文件开头
              print(f.tell()) # 输出结果为:3
              f.seek(4,1)     # 从当前位置往后移动4个字节,而此时的当前位置为3
              print(f.tell()) # 输出结果为:7

          #2模式
          with open('a.txt',mode='rb') as f:
              f.seek(3,1) # 从当前位置往后移动3个字节,而此时的当前位置就是文件开头
              print(f.tell()) # 输出结果为:3
              f.seek(4,1)     # 从当前位置往后移动4个字节,而此时的当前位置为3
              print(f.tell()) # 输出结果为:7
  • 相关阅读:
    SVN使用教程总结
    windows禅道环境搭建
    反编译.NET工程
    DAO层,Service层,Controller层、View层 的分工合作
    MyBatis在insert插入操作时返回主键ID的配置
    MySQL中You can't specify target table for update in FROM clause异常
    MySQL对时间戳的转换处理
    苹果台式一体机笔记本安装win双系统攻略教程
    Eclipse安装SVN教程
    java遇到 Check $M2_HOME 问题 解决-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variable and mvn script match.
  • 原文地址:https://www.cnblogs.com/hansblogs/p/13324288.html
Copyright © 2020-2023  润新知