文件、游标操作模式详解

文件操作模式

    w:没有文件新建文件,有文件就清空文件

      w = open('1.txt', 'w', encoding='utf-8')
        w.write('000 ')
        w.flush()              #在写入大量数据,要及时处理内存空间,不然内存可能溢出导致数据丢失
        w.write('111 ')
        w.flush()              # 最后一次flush()操作可以省略
        w.writelines(['222 ', '333 '])     # 一次性写入多行
        w.write('444')
        w.write('555')
        w.close()              # 1.将内存的的数据刷新到硬盘中;2.释放文件资源

  # 需求:
    1.完成文本类型的文件复制:1.txt => 11.txt
      r = open('1.txt', 'r', encoding='utf-8')
      w = open('11.txt', 'w', encoding='utf-8')
      for line in r:              # 遍历就是一行一行读 取读文件的流
        w.write(line)
          w.flush()
          w.close()
          w.close()          # 将文件的关闭交给with管理,当with中逻辑结束后,系统会自动释放文件


    2.用with open 方式打开文件            

      with open('1.txt', 'r', encoding='utf-8') as r, open('source.txt', 'w', encoding='utf-8') as w:

      for line in r:
        w.write(line)
        w.flush()
       # w.close() 系统自动完成
          # r.close()

各种模式总结:

      r: 读
      w: 写(无创建,有清空)
      a: 追加(有创建的功能)

      t: 文本操作(默认模式) r=>rt w=>wt a=>at
      b: 非文本文件必须采用二进制模式来处理
      +: 可读可写
      r+: 不会创建文件的可读可写 | w+:创建清空文件的可读可写 | a+:创建不清空文件(追加)的可读可写


    例:with open('1.txt', 'wt', encoding='utf-8') as f:
      f.write('666')

      # 借助读写,完成追加
        with open('1.txt', 'rt', encoding='utf-8') as f1:
         data = f1.read()
         data += '666'
        with open('1.txt', 'wt', encoding='utf-8') as f2:
       f2.write(data)

      # a为写模式,在原数据后追加写入新数据
        with open('1.txt', 'a', encoding='utf-8') as f:
        f.write('777')

with方法完成文本文件的复制:

    # 先读后写
      with open('source.txt', 'r', encoding='utf-8') as f1,
       open('target.txt', 'a', encoding='utf-8') as f2:

  # 读取一个字节,如果是行/文件等结束标识,就返回该标识,否则返回None
        print(f1.newlines)

        first_data = f1.read(9)
        f2.write(first_data)
        f2.flush()

        second_data = f1.readline()
        f2.write(second_data)
        f2.flush()

        last_data = f1.read()
        f2.write(last_data)
        f2.flush()

        print(f1.newlines)
        data = f1.read()
         print(data)


     # 边读边写赋值
       with open('source.txt', 'r', encoding='utf-8') as f1:
    with open('target.txt', 'a+', encoding='utf-8') as f2:
      for line in f1:
     f2.write(line)

 非文本内容处理

      with open('333.mp4', 'rb') as f1:
   with open('666.mp4', 'wb+') as f2:
       for line in f1:
    f2.write(line)


游标模式

      方法:seek(偏移量, 偏移位置)

      偏移量:移动的字节数,负数是结合模式1,2往前偏移

      偏移位置:
          # -- 0 - 从文件开始位置开始偏移 | 1 - 从当前游标位置开始偏移 | 2 - 从文件末尾开始偏移

      # b'你好1234567890'

      # 游标读
          with open('source.txt', 'rb') as f:
            d1 = f.read(11)
            print(d1)
            # print(d1.decode('utf-8'))

    # 当前游标的位置
            print(f.tell())

    # 游标操作 - 从末尾位置开始
        f.seek(-3, 2)
        d2 = f.read()
        print(d2.decode('utf-8')) # 890

    # 游标操作 - 从当前位置开始
         f.seek(-3, 1)
         d2 = f.read()
         print(d2.decode('utf-8')) # 34567890

    # 游标操作 - 从头开始
        f.seek(3, 0)
         d2 = f.read()
         # print(d2)
         # print(d2.decode('utf-8')) # 好1234567890

       # 游标写:会覆盖书写
          with open('source.txt', 'rb+') as f:
          f.seek(11)
         # print(f.read())
          f.write(b'000')

    # 案例
      with open('001.png', 'rb') as f:
      data = f.read()
      print(len(data))
原文地址:https://www.cnblogs.com/yuanlianghong/p/10610579.html