引言¶
程序运行的过程中,所有的变量都是在内存中临时存储,把内存中的变量变为可存储或者可传输的,然后才能存储到磁盘或者数据交换,这个过程称之为序列化,反之,称为反序列化
- dump 存/写 序列化
- load 取/读 反序列化
关于编码¶
https://docs.python.org/3/library/codecs.html#standard-encodings
Python3默认为utf_8
编码,可用_
替代-
,可忽略大小写
所以这些别名也都有效:utf-8
, utf8
, UTF-8
, U8
, UTF
, cp65001
,但使用别名可能会导致执行速度变慢
文件读写¶
使用Python的内置函数open()
来操作文件
文档:https://docs.python.org/zh-cn/3.10/library/functions.html#open
- 打开文件,返回一个文件对象
- 进行读写操作
- 关闭文件
f = open(filename, mode="r", encoding='utf_8', errors='ignore')
"""
mode 操作模式
encoding 操作非utf_8编码文件时需要指定编码格式
errors 如果夹杂非法编码字符,默认忽略处理,也可以自定义
"""
# 读操作
f.read() # 读取全部
f.read(size) # 读取指定字符
f.readlines() # 读取全部,按行存入list
# readlines会把每行后面的回车"\n"也读到,可以这样处理
for line in f.readlines():
print(line.strip())
# 写操作
f.write() # 写入
# 关闭文件,防止文件泄露或破坏
f.close()
支持with语句触发上下文管理器,自动关闭,自动处理异常
with open(filename1, mode) as f:
f.read()
操作模式¶
操作
r
只读(默认),文件不存在则报错x
新建,文件不存在则新建,存在则报错w
只写,文件不存在则新建,存在则清空a
追加,文件不存在则新建,存在则追加
类型
t
文本模式(默认),可省略,r
与rt
等价b
二进制模式,读写bytes数据,比如Excel、图片、视频等,rb
、wb
、ab
office文件其实是个压缩包,由很多.xml和其他文件构成,所以属于二进制
更新/读写模式,较少使用
r+
、rb+
、w+
、a+
内存读写¶
StringIO¶
- 向内存中写入str数据
from io import StringIO
# 创建一个缓存对象
f = StringIO()
f.write('Hello!\nHi!\nGoodbye!') # 像操作文件一样写入
- 从内存中读取str数据
from io import StringIO
# 创建一个缓存对象
f = StringIO('Hello!\nHi!\nGoodbye!') # 初始化
f.read() # 像操作文件一样读取
BytesIO¶
- 向内存中写入bytes数据
from io import BytesIO
# 创建一个缓存对象
f = BytesIO()
f.write(b'\xe4\xb8\xad\xe6\x96\x87') # 像操作文件一样写入
- 从内存中读取bytes数据
from io import BytesIO
# 创建一个缓存对象
output_buffer = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87') # 初始化
f.read() # 像操作文件一样读取
指针问题¶
f.tell()
返回指针当前位置f.seek(offset, 0)
移动指针位置,从初始位置开始计算(默认),移动offset个字节f.seek(7, 1)
移动指针位置,从当前位置开始计算,往后移动7个字节f.seek(-7, 2)
移动指针位置,从末尾位置开始计算,往前移动7个字节
print(f.tell()) # 操作前,指针位置是0
f.write('Hello') # 进行读取/写入操作
print(f.tell()) # 操作后,指针位置移到了最后5
print(f.read()) # 此时如果读取,则会得到空值
f.seek(0) # 可以将指针移回初始位置,此时再读取将可以读到
# 另外也可以用以下方式获取,不受指针位置影响
print(f.getvalue())
最后更新:
2023-08-04