Day 9
1.文件操作
'''
fp=open('文件名',mode='模式',encoding='utf-8')
fp -> 文件io对象(文件句柄)
i => input 输入
o => output输出
'''
一、文件的写入
1.打开文件
fp = open('ceshi1.txt',mode='w',encoding='utf-8')
2.写入内容
fp.write('把八戒塞进去')
3.关闭文件
fp.close()
二、文件的读取
#1.打开文件
fp = open('ceshi1.txt',mode='r',encoding='ute-8')
#2.读取内容
res=fp.read()
print(res)
#关闭文件
fp.close()
三、字节流的转换
bytes : 是用来传输或者储存的数据格式
b’1234’ b’abcd’ b’'我爱你 ->b开头的字节流,范围只能是ascii编码
如果是中文使用encode 和 decode 来进行转换;
将字符串和字节流(bytes流)进行转换(参数写成转化的字符编码格式)
encode() 编码 将字符串转化为字节流
decode() 解码 将字节流转化成字符串
a = b'1345'
print(a,type(a))
strvar='我爱你'
#encode 编码- > 变成二进制字节流
res=strvar.encode('utf-8')
print(res,type(res))
#decode 解码 —>二进制字节流恢复成原来的字符串
res2=res.decode('utf-8')
print(res2,type(res2))
#len 可以计算字节个数
num = len(res)
print(num)
#一个中文占用3个字节,通过decode 反解出爱这个字
res3=b"\xe7\x88\xb1".decode("utf-8")
print(res)
#程序员的表白方式
strvar='我是你这辈子也得不到的男人'
strvar2= strvar.encode()
print(strvar2)
四、储存二进制字节流
不需要指定encoding编码集,否则报错
fp = open ('ceshi2.txt',mode='wb')
fp.write(strvar2)
fp.close()
五、读取二进制字节流
fp= open('ceshi2.txt',mode='rb')
res=fp.read()
fp.close()
print(res)
#通过decode反解出字符串
strvar=res.decode()
print(strvar)
六、复制图片
图片 音频 视频
#1.读取原图的所有内容
fp=open('八戒.png',mode='rb')
res=fp.read()
fp.close
#2.把读取的内容储存到另一个文件
fp = open('集合2.png',mode='wb')
#指定绝对路径(完整路径)
#fp = open(r"E:\python31\day8\集合3.png",mode="wb")
fp,wtite(res)
fp.close()
2.文件的扩展模式
utf-8编码格式下 默认一个中文三个字节 一个英文或符号 占用一个字节
read() 功能:读取字符的个数(里面的参数代表字符个数)
seek() 功能:调整指针的位置(里面的参数代表字节个数)
tell() 功能:当前光标左侧所有的字节数(返回字节数)
seek(0) 直接把光标移动到文件的开头
seek(0,2) 直接把光标移动到文件的末尾
#一、文件的扩展模式
#r+ 先读后写
fp=open('cesshi3.txt',mode='r+',encoding='utf-8')
#先读
res=fp.read()
print(res)
#后写
fp.write('1233')
#再读
fp.seek(0)
res=fp.read()
print(res)
fp.close
#r+ 先写后读
fp = open('ceshi3.txt',mode='r+',encoding='utf-8')
fp.seek(0,2)#调整光标位置到末尾
fp.write('321323232')
fp.seek(0)
res = fp.read()
print(res)
fp.close()
# w+ 可读可写
fp=open('ceshi4.txt',mode='w+',encoding='utf-8')
fp.write('abc')
fp.seek(0)
res=fp.read()
print(res)
fp.close()
# a+ 可读可写
'''文件不存在时,默认创建新文件'''
fp=open('ceshi5.txt',mode='a+',encoding='utf-8')
fp.seek(1)
fp.write('abc')
fp.close()
二、read seek tell 三个函数的使用
fp = open('ceshi6.txt',mode='r+',encoding='utf-8')
res=fp.read(3)
print(res)
fp.seek(6)
print(fp.read(1))
#计算文件指针左侧所有的字节数
res=fp.tell()
print(res)
fp.close()
#注意点,seek移动中文字节的时候,有可能会报错
fp=open('ceshi6.txt',mode='r+',encoding='utf-8')
fp.seek(2)
res=fp.resd()
print(res)
fp.close()
三、with 语法的使用(close操作with语法可以自动实现)
with open('集合.png',mode='rb') as fp :
res=fp.read()
with open(r"E:\python31\day8\集合4.png",mode="wb") as fp:
fp.write(res)
#继续优化
with open('集合.png',mode='rb') as fp1 , open(r"E:\python31\day8\集合4.png",mode='wb') as fp2:
res=fp1.read()
fp2.write(res)
3.close 文件关闭的意义
刷新缓冲区 flush
当文件关闭的时候自动刷新缓冲区
当整个程序运行结束的时候自动刷新缓冲区
当缓冲区写满了 会自动刷新缓冲区
手动刷新缓冲区
fp = open('ceshi6.txt',mode='r+',encoding='utf-8')
fp.write(zzz)
#手动把缓冲区里面的内容写入文件当中
fp.flush
while True:
pass
fp.close()
#2.文件的相关函数
fp=open('ceshi6.txt',mode='a+',encoding='utf-8')
#readbable() 功能:判断文件对象是否可读
res=fp.readable()
print(res)
#writable() 功能:判断文件对象是否可写
res=fp.writable()
print(res)
#readline() 功能:读取一行文件内容
#参数 > 当前行字符总个数 => 以当前行读取
#参数 < 当前行字符总个数 => 以参数的大小来读取字符的个数
#默认readline 读取一行
with open('ceshi7.txt',mode='r+',encoding='utf-8') as fp :
res=fp.realine(52)
print(res)
#文件对象符fp也是一个可迭代对象
#在遍历文件对象的时候,默认一次拿一行
for i in fp:
print(i)
#读取所有内容
with open('ceshi7.txt',mode='r+',encoding='utf-8') as fp :
#先读取一行
res=fp.readline()
#判断是不是空
while res:
print(res)
res=fp.readline()
#readlines() 功能:将文件的内容按照换行读取到列表中
lst_new=[]
with open('ceshi7.txt',mode='r+',encoding='utf-8') as fp:
lst=fp.rendlines()
# print(lst) # ['\t窗前明月光\n', '疑是鞋两双\t\t\n', '\t\t举头王明月\n', '\t低头看裤裆']
for i in lst:
lst_new.append(i,strip())
print(lst_new) # ['窗前明月光', '疑是鞋两双', '举头王明月', '低头看裤裆']
#writelines() 功能:将内容是字符串的可迭代性数据写入文件中
lst = ["春眠不觉晓\n","处处蚊子咬\n","夜来大狗熊\n","一个也跑不了\n"]
with open('ceshi8.txt',mode='w',encoding='utf-8') as fp :
fp.writelines(lst)
#truncate() 功能:把截取的字符串提取出来,然后清空内容将提取的字符串重新写入文件夹中(字节)
with open('ceshi8.txt',mode='r+',encoding='utf-8') as fp :
fp.truncate(3)