Skip to content

Latest commit

 

History

History
162 lines (110 loc) · 3.43 KB

420-190199-二进制模式.sy.md

File metadata and controls

162 lines (110 loc) · 3.43 KB
show version enable_checker
step
1.0
true

二进制模式

回忆

  • 上次了解了 close
    • 写了 文件之后
    • 需要 关闭文件

图片描述

  • 计算机中不都是使用二进制吗?
  • 可以用二进制的方式读写文件吗?🤔

mode

  • mode 模式设置为 rb
    • r - read - 读
    • b - binary - 二进制 和 text 文本相对

图片描述

  • 这样流头就可以自由地相对运动了
  • 返回值变成了字节流
    • b"222\n"
  • whence 除了相对于头、相对于当前
  • 还有一种相对于尾的模式
  • 怎么用呢?

seek

图片描述

  • whence = 2 是从尾部计算
  • -3 就是倒数第 3 个字符
  • 返回值也是字节流

可以用二进制写么

  • 先查一下帮助

图片描述

  • 判断如果要"wb"的话就会 truncate 原始文件
  • 虽说如此
  • 我还是想试试

wb

图片描述

  • 用二进制写模式打开文件
  • 可想而知
    • 原始文件还在
    • 但里面内容没了
    • 写模式不能读
  • 二进制写的时候不能直接写字符串
    • 而需要写二进制字节流
  • 写完了
    • 我想读出来

读模式

  • 打开模式肯定不能是写模式
  • 一写就把原来的都清空了
  • 用默认的 r

图片描述

  • 可以看到原来的 3 的位置
  • 第一个字节的位置为 0
  • 然后是 1,2,3
  • 111\n222\n333
  • 从第一个\n
  • 开始重写
  • 写了 3 个 a

观察文件

图片描述

  • 读写成功

图片描述

  • 如果oeasy.txt中有非ascii字符
    • 情况会如何呢?

构建文件

图片描述

  • 细致观察

图片描述

  • 二进制状态

图片描述

  • 可以用python打开这个文件吗?

打开文件

f = open("ch.py","rb")
bytes_file = f.read()
print(bytes_file)
  • 运行结果

图片描述

  • 用什么解码呢?

解码

f = open("ch.py","rb")
bytes_file = f.read()
str_file = bytes_file.decode("utf-8")
print(str_file)
  • 运行结果

图片描述

  • 解码成功
  • 如果按照gb2312模式解码
  • 会如何呢?

错误的解码方式

f = open("ch.py","rb")
bytes_file = f.read()
str_file = bytes_file.decode("gb2312")
print(str_file)
  • 运行结果

图片描述

  • 解铃还须系铃人
  • 解码方式一定要选对
  • 默认的utf-8就很好用

总结

  • 这次我们用二进制写了文件
  • 写的时候也可以 seek 调整流文件头
  • 这二进制写(wb)和字符写(wt)好像也差不多
  • 为什么要有这么一个二进制写的方式呢?🤔
  • 下次再说 👋