IO (input and output)输入输出流
(1)一个完整的IO操作流程:
打开文件——读取数据——数据运算——数据的持久化(输出)——关闭资源
持久化设备:(ROM)断电的情况下依然会保存数据,将内存中的瞬时数据持久化到磁盘上。
读取数据:是将数据从一个持久化设备中,读取到内存中
输出数据:是将数据从内存中保存到磁盘上
RAM和ROM(随机存储内存):相当于电脑的内存和硬盘。
RAM(只读内存):断电时将会丢弃其存储内容
注:输入输出都是站在内存的角度来讲。存入内存,输入,从内存取出,输出。
一,open函数
查看帮助文档
>>> help(open)
Help on built-in function open in module io:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
mode模式:
encoding:编码方式
打开当前工作空间的文件hah.txt(文件是已存在的)
调用open()打开文件
>>> open("hah.txt","r")
<_io.TextIOWrapper name='hah.txt' mode='r' encoding='cp936'>
调用close()关闭io操作
>>> f.close()
open(“hah.txt”,“r”)
(默认值为“rt”=“r”) t可以不写,默认文本文档:没有格式的字符文档
(2)查看文件内容
#当运行时命令行不在文件所在的路径
>>> f = open ("E:\\python\\2020-2-17\\hah.txt","rt")
#以read方法获取文件中的内容
>>> msg = f.read()
>>> print(msg) 等价于一行print =( f.read())
>你今天真好看
>>> f.close()
(3)往文件中写入
>>> msg = "很高兴认识你"
>>> f = open ("hah.txt","w")
>>> f.write(msg)
6
>>> f.close()
运行结果:文件内容被新的msg覆盖
文件不覆盖的情况
mode = “a”
在文件呢存在时 a=append在文件内容后追加写入,默认不换行
不存在时会创建文件,w也会。
>>> msg = "很高兴认识你"
>>> f = open ("hah.txt","a")
>>> f.write(msg)
6
>>> f.close()
换行:
- msg = “很高兴认识你/n” 第一次追加时没有换行
命令行多次执行:f.write(msg)
2.newline=None 将None换成/n
若想在第一次追加时换行,
f = open (“hah.txt”,“a”,newline="\n")
在设置后面的某一参数,前面的参数可以不写,但要更改的参数名必须写上。
二,字节流
字节数据:例如图片,视频
字节没有编码
输出为二进制
f = open("1.png",mode="br")
picture = f.read()
print(picture)
f.close()
f = open("1.png",mode="br")
picture = f.read()
#将该图片保留到另一个地方文件名为c.png,不写路径就是当前地方
ff = open("c.png","wb")
ff.write(picture)
f.close()
ff.close()
此时c文件出现
三,文件备份
def copy_file(src, dest):
fr = open(src, "rb")
fw = open(dest, "ab")
#这是将文件一次性读完,这样存在不好的地方就是当文件过大,会导致电脑内存不足,导致蓝屏
fw.write(fr.read())
fr.close()
fw.close()
x = input("请输入需要拷贝文件路径:")
y = input("请输入备份路径:")
copy_file(x, y)
所以为解决这个问题:
当文件读完时,会出现以下情况,所以我们可以以下结果进行判断,进行分段读取,按照特定大小读取。
>>> f = open ("E:\\python\\2020-2-17\\hah.txt","rt")
>>> f.read()
'很高兴认识\n很高兴认识你很高兴认识你很高兴认识你'
>>> f.read()
''
>>> f = open ("E:\\python\\2020-2-17\\hah.txt","br")
>>> f.read()
b'\xba\xdc\xb8\xdf\xd0\xcb\xc8\xcf\xca\xb6\r\n\xba\xdc\xb8\xdf\xd0\xcb\xc8\xcf\xca\xb6\xc4\xe3\xba\xdc\xb8\xdf\xd0\xcb\xc8\xcf\xca\xb6\xc4\xe3\xba\xdc\xb8\xdf\xd0\xcb\xc8\xcf\xca\xb6\xc4\xe3'
>>> f.read()
b''
def copy_file(src, dest):
fr = open(src, "rb")
fw = open(dest, "ab")
while True:
content = fr.read(10 * 1024 * 1024)
if content != b'': #判断文件是否读取完成。
# 直接将数据读取到内存
fw.write(content)
else:
break
fr.close()
fw.close()
x = input("请输入需要拷贝文件路径:")
y = input("请输入备份路径:")
copy_file(x, y)
四,with语句块
因为在io操作时,必须要使用.close()关闭io流,不关闭,例如执行删除这个文件就不成功。
因此可以采用with open() as 别名, 即可关闭,方便简洁。
with open("hah.txt","r") as f:
print(f.read())
五,
(1)序列化
将逻辑单位存入磁盘,对象就是逻辑单位
>>> ls = [ 3,5,8,3,6,2]
要引入模块
>>> import pickle as x
将列表序列化:
>>> x.dumps(ls)
b'\x80\x04\x95\x11\x00\x00\x00\x00\x00\x00\x00]\x94(K\x03K\x05K\x08K\x03K\x06K\x02e.'
>>> d = x.dumps(ls)
>>> d
b'\x80\x04\x95\x11\x00\x00\x00\x00\x00\x00\x00]\x94(K\x03K\x05K\x08K\x03K\x06K\x02e.'
在存入磁盘:
IndentationError: unexpected indent
>>> with open("E:\\python\\xu.dat","bw")as f:
... f.write(d)
...
28
运行结果:
dump:
直接序列化到磁盘
>>> ls
[3, 5, 8, 3, 6, 2]
>>> f = open("E:\\python\\fan.dat","bw")
>>> x.dump(ls,f)
>>> f.close()
反序列化
将磁盘里的对象逻辑显示出来
loads()
>>> with open("E:\\python\\xu.dat","br") as f:
... msg = f.read()
...
>>> msg
b'\x80\x04\x95\x11\x00\x00\x00\x00\x00\x00\x00]\x94(K\x03K\x05K\x08K\x03K\x06K\x02e.'
>>> x.loads(msg)
[3, 5, 8, 3, 6, 2]
load() :配合io流使用。
>>> f = open("E:\\python\\fan.dat","br")
>>> f.read()
b'\x80\x04\x95\x11\x00\x00\x00\x00\x00\x00\x00]\x94(K\x03K\x05K\x08K\x03K\x06K\x02e.'
>>> f.close()
>
>>> f = open("E:\\python\\fan.dat","br")
>>> x.load(f)
[3, 5, 8, 3, 6, 2]
>>> f.close()
json模块
一般序列化字典类型的数据
序列化成json字符串
使用方法同上四种所述。
补充: