zoukankan      html  css  js  c++  java
  • 文件操作的模式选择

    一、rw模式的结合

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

    # 需求:
    # 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()
      r.close()

    # 将文件的关闭交给with管理,当with中逻辑结束后,系统会自动释放文件
      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+:创建不清空文件(追加)的可读可写

      x:
      U:

      

      # 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 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)

    # x:写模式,创建文件,如果文件以存在,就抛异常
      with open('000.txt', 'x', encoding='utf-8') as f:
      pass

    ***文件的游标操作***

    # 方法: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')

    # 案例:百度网盘的秒传。

    tagData = b''
    with open('001.png', 'rb') as f:
    # 通过其他途径(sys模块)来获取文件总大小
    data = f.read()
    length = len(data)
    # 开头
    f.seek(0, 0)
    d1 = f.read(10)
    # 1/3
    f.seek(length // 3, 0)
    d2 = f.read(10)
    # 2/3
    f.seek(length // 3 * 2, 0)
    d3 = f.read(10)
    # 末尾
    f.seek(-10, 2)
    d4 = f.read(10)
    tagData = d1 + d2 + d3 + d4
    # 秒传依据
    print(tagData)

    newData = b""
    with open('001.png', 'rb') as f:
    data = f.read()
    length = len(data)
    f.seek(0, 0)
    newData += f.read(10)
    f.seek(length // 3, 0)
    newData += f.read(10)
    f.seek(length // 3 * 2, 0)
    newData += f.read(10)
    f.seek(-10, 2)
    newData += f.read(10)

    if newData == tagData:
    print('秒传成功')
    else:
    print('传的这么慢,你个**')

  • 相关阅读:
    一套完整的javascript面试题
    遇到的java.lang.NoClassDefFoundError解决了
    Win7下启动Internet信息服务(IIS)管理器
    我的第一个专业博客
    “用NetBeans打开项目时项目名变成红色”问题解决
    Struts2框架实现计算器功能
    MyEclipse移动包到另一个项目时出现错误:Resource is out of sync with the file system.
    制作Javascript弹出窗口技巧九则
    windows 的鼠标事件(Event)
    Javascript使用cookie
  • 原文地址:https://www.cnblogs.com/wanglei957/p/10609665.html
Copyright © 2011-2022 走看看