文件的基本操作
1.文件的打开模式
w write 写入模式:只能写入字符串和字节流
文件不存在则创建文件,存在的话则打开清空内容,并且将文件指针放在文件的开头
r read 读取模式
文件不存在则报错! 存在的话则打开文件,并且将文件指针放在文件的开头
a append 追加模式
文件不存在则创建文件,存在的话则打开文件,并且将文件指针放在文件的末尾
x xor 异或模式(基本不用)
文件已存在则报错! 不存在的话则创建文件,将文件指针放在文件的开头
#扩展模式 (配合打开模式的辅助模式,自己单独不能使用)
+ plus 增强模式(可以让文件具有读写功能)
b bytes bytes模式(二进制字节流)
#模式一共16种
w,w+,wb,wb+
r,r+,rb,rb+
a,a+,ab,ab+
x,x+,xb,xb+
2.文件的写入读取操作
格式:
fp = open(文件名,模式,字符编码)#打开文件
fp.read() #读取文件
fp.write() #写入文件
fp.close() #关闭文件
# 一.文件的写入操作
fp = open("lianxi.txt",mode="w",encoding="utf-8")
fp.write("把大象塞进去")
fp.close()
# 二.文件的读取操作
fp = open("lianxi.txt",mode="r",encoding="utf-8")
res = fp.read()
print(res)
fp.close()
3.字节流
字节流语法格式(前面加b) : b"123"
二进制字节流的应用场景: 在数据传输或者在数据存储时,使用的一种数据格式;
多个字符放在一起叫做字符串,多个字节放在一起叫做字节流
# 1.将字符串和字节流(Bytes流)类型进行转换 (参数写成转化的字符编码格式)
"""
encode() 编码 将字符串转化为字节流(Bytes流)
decode() 解码 将Bytes流转化为字符串
"""
strvar = b"123"
print(strvar , type(strvar)) # b'123' <class 'bytes'>
# 2. 中文不能在字符串前面加b,必须是ascii编码才能加:
#办法: 把中文变成字节流
# encode 编码
strvar = "我爱你".encode("utf-8")
print(strvar)
# decode 解码
res = strvar.decode("utf-8")
print(res)
# 3.写入字节流
"""mode = wb 代表写入的是字节流 , 不要指定任何编码集 """
fp = open("lianxi2",mode="wb")
strvar = "爱上一匹野马,家里没有草原"
fp.write(strvar.encode())#将字符串转化成字节流,默认utf-8编码
fp.close()
# 4.读取字节流
"""mode = rb 代表读取的是字节流 , 不要指定任何编码集 """
fp = open("lianxi2",mode="rb")
res = fp.read()
fp.close()
print(res) #读取的都是二进制字节流
print(res.decode()) #解码字节流
# 5.复制图片:先读取字节流,再写入另一个文件中
# 打开原文件,读取其中的字节流
fp = open("集合.png",mode="rb")
res = fp.read()
fp.close()
print(res)
# 把这些字节流写入到另外文件中
fp = open("集合2.gif",mode="wb")
fp.write(res)
fp.close()
4.文件的扩展模式
"""
utf-8编码格式下,默认一个中文三个字节,一个英文或字符占用一个字节
read() :读取光标右边字符(参数)
参数:根据文件打开模式而产生变化,如果带有b字节流模式,读取的是字节的个数,否则读取的是字符的个数
seek() :调整指针的位置(里面的参数代表字节个数)
seek(0) 把光标移动到文件开头
seek(0,2)把光标移动到文件末尾
tell() :当前光标左侧的所有字节数
"""
# with ...as 语法,可以省略掉close操作
# 1.r+先读后写
with open("1.txt",mode="r+",encoding="utf-8") as fp:
res=fp.read(2) #先读,读完光标跑到文件末尾
print(res)
res=fp.tell() #计算文件字节数
print(res)
fp.write("abc") #写入内容,光标跑到文件末尾
fp.seek(0) #再读需要调整光标位置
res=fp.read()
print(res)
# 2.a+和r+两个模式的区别
"""
a+模式下:写入内容时,会强制把光标移动到文件的末尾(seek()移动光标位置也不行)
r+模式下:写入内容时,会随着光标的位置改变而替换光标右边的字符
"""
# 3.刷新缓冲区:flush
"""
当文件关闭的时候自动刷新缓冲区;
当整个程序运行结束时自动刷新缓冲区;
当缓冲区写满时,会自动刷新缓冲区;
手动刷新缓冲区:flush
"""
5.文件相关函数
# 1.readable() 判断文件对象是否可读
# 2.writable() 判断文件是否可写
with open("1.txt",mode="r",encoding="utf-8")as fp:
res=fp.readable() #返回True
print(res)
res=fp.writable() #返回False
print(res)
# fp对象本身可以遍历(迭代器)
"""遍历时,按照一行一行读取所有内容"""
# 3.readline() 读取一行文件内容
# (1)读取读取文件所有行的数据:
with open("1.txt",mode="r",encoding="utf-8")as fp:
res=fp.readline()
while res:
print(res)
res=fp.readline()
# (2)readline(n) 读取一行中n个字符个数
# 4.readlines() :将文件中的内容按照换行读取到列表当中
with open("1.txt",mode="r",encoding="utf-8")as fp:
lst=fp.readlines()
print(lst) #列表的字符串中有没用的符号
lstnew=[] #创建新列表
for i in lst: #遍历文件列表
res=i.strip() #去除杂质
lstnew.append(res) #追加到新列表中
print(lstnew)
# 5.writelines() 将元素是字符串的可迭代性数据写入文件中
lst=["11111","22222","33333","44444"]
with open("2.txt",mode="w+",encoding="utf-8")as fp:
fp.writelines(lst)
fp.seek(0)
res=fp.read() #写入的内容是连在一起的
print(res)
# 要使写入的内容各行显示,可以先在原字符串后加上换行符(
)
# 6.truncate() 将截取的字符串提取出来,然后清空内容,将提取的字符串重新写入文件中
'''参数是数字,截取的是字节'''