IO流
什么是IO流
Input、Output Stream
IO流说的主要是计算机的输入和输出操作
常见的IO操作,一般说的是内存与磁盘之间的输入输出
IO流是一种常见的持久化技术
python操作IO流
使用open函数即可,open函数的主要目的是打开一个文件
基本语法格式如下:
open(filename, mode)
filename:包含了你要访问的文件名称或者路径。
mode:决定了打开文件的模式:只读,写入,追加等,默认文件访问模式为只读®
f = open("a.txt")在这里插入代码片
读取数据或者写入数据
msg = f.read()
IO流操作是非常宝贵的系统资源 ,使用完之后要关闭流f
f.close()
IO流的分类
根据数流动(站在内存的角度上)的方向分:
- 输入流
- 输出流
根据数据的类型分:
- 字节流
- 字符流
文件对象常用的方法
(1)read([size])
为了读取一个文件的内容,调用read(size), 这将读取一定数目的数据, 然后作为字符串或字节对象返回。
size 是一个可选的数字类型的参数。 当 size 被忽略了或者为负, 那么该文件的所有内容都将被读取并且返回。
(2)write(string)
将 string 写入到文件中, 然后返回写入的字符数
(3)writelines(sequence)
向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符
(4)close()
当你处理完一个文件后, 调用 f.close() 来关闭文件并释放系统的资源,如果尝试再调用该文件,则
会抛出异常。
注意:close自动的调用flush进行最后的文件刷新
(5)flush()
刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入
字符流和字节流
字符流
mode = “t” 表示使用字符来操作IO流
字节流
mode = “b” 表示使用字节来操作IO流
注意:字节流操作大数据的,不建议一次性读取
案例:大文件的复制
from os import path
def copy_file():
src = input("请输入要备份数据的路径:")
dest = input("请输入保存备份数据的路径:")
f = open(src, "rb")
filename = src[src.rfind("\\")+1:]
f2 = open(path.join(dest, filename), "wb")
while True:
data = f.read(1024 * 1024)
if data == b"":
print("数据读取完成了")
break
else:
f2.write(data)
f.close()
f2.close()
if __name__ == '__main__':
copy_file()
对象序列化
什么叫对象序列化
将内存中的一个抽象概念、逻辑概念(对象)转换为字符或者字节数据的过程,就叫做对象序列化
pickle 模块
可以将对象转换为字节数据
- dump 将对象序列化成为字节数据,并且保存到file中
必填参数obj表示将要封装的对象
必填参数file表示obj要写入的文件对象,file必须以二进制可写模式打开,即“wb” - dumps 将对象序列化成为字节数据
- load 将一个file对象反序列化为对象
必填参数file必须以二进制可读模式打开,即“rb” - loads 将一个字节数据反序列化为对象
json
用法类似于pickle,可以将对象转换为字符数据
json.dumps 将 Python 对象编码成 JSON 字符串
json.loads 将已编码的 JSON 字符串解码为 Python 对象
注意:json这个模块一般用来序列化字典对象,或者转换json数据,但是其他对象也是可以的
with语句块
with语句块中的代码执行完毕之后会自动进行流的关闭,不需要我们调用close()方法;with还可以很好的处理上下文环境产生的异常
with open('/usr/file.txt') as f:
for line in f:
print(line)