python中的IO操作

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()

换行:

  1. 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字符串
使用方法同上四种所述。

补充:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值