参考网址

https://blog.csdn.net/weixin_35688430/article/details/107814004

打开文件 open()函数

## - 打开一个文件,返回一个文件对象(流对象)和文件描述符。打开文件失败,则返回异常
open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd= True, opener=None)
  • demo演示:打开一个文件,获取文件内容并打印出来

'''
- 默认当前路径
- 默认'只读'模式
'''

file = open('text.txt')
print(file.read())
file.close()
  • w 模式

    • 文件以'只写'的方式打开
    • 若文件不存在,则创建该文件
    • 若文件存在,则清空原有的内容,写入新的东东
file = open('text.txt','w')
file.write('1111111112222222222233333333333')
file.close()
  • a模式

    • 文件存在,只写打开,追加内容
    • 文件不存在,则创建后,只写打开,追加内容
file = open('text.txt','a')
file.write('\n 我是新添加的内容')
file.close()
  • 小结

    • r 是只读,wxa 都是只写
    • wxa 模式都可以产生新文件
    • w 不管文件存在与否,都会生成全新内容的文件
    • a 不管文件是否存在,都能在打开的文件尾部追加
    • x 必须要求文件事先不存在,自己创建一个新文件

文本模式t和二进制模式b

  • 文本模式t: 字符流,将文件的字节按照某种字符编码(涉及 encoding='xxx')理解,按照字符操作,open的默认mode就是 rt

    • encoding:编码,仅文本模式使用
  • 二进制模式b: 字节流,将文件就按照字节理解,与字符编码无关,二进制模式操作时,字节操作使用bytes类型

    • 字节流用得比较多,比如 'rb','wb'
  • demo演示

file = open('text.txt','rb') # 二进制只读的方式打开
# 返回 byte 类型
print(file.read()) # b'1111111112222222222233333333333\r\n\xce\xd2\xca\xc7\xd0\xc2\xcc\xed\xbc\xd3\xb5\xc4\xc4\xda\xc8\xdd\r\n'
file.close()


file = open('text.txt','wb')
file.write('我很好'.encode()) # encode()默认就是'utf-8'编码
file.close()


file = open('text.txt','rb')
# 如果不加 decode(),就是以'字节流'的形式输出,不便于查看
print(file.read().decode()) # decode()以'utf-8'解码
file.close()

序列化

  • 为什么要"序列化"
- 内存中的字典、列表、集合以及各种对象,如何保存到一个文件中?
- 如果是自己定义的类的实例,如何保存到一个文件中?
- 如何从文件中读取数据,并让他们在内存中再次恢复成自己对应的类的实例?
- 要设一套协议,就按照某种规则,把内存中数据保存到文件中。文件是一个字节序列,所以必须把数据转换成字节序列,输出到文件。这就是序列化。反之,把文件的字节序列恢复到内存并且还是原来的类型,就是反序列化

  • 序列化: 将内存中对象存储下来,把它变成一个个字节 ->二进制

  • 反序列化: 将文件的一个个字节恢复成内存中对象 -> 二进制