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
posted @ 2020-07-16 18:36  画堂晨起  阅读(249)  评论(0编辑  收藏  举报