python基础之文件的操作
文件操作
语法:
fp = open(文件,模式,编码集)
fp => 文件的io对象 (文件句柄)
i => input 输入
o => outpur 输出
fp.read() 读取文件内容
fp.write() 写入文件的内容
1.文件的写入操作
# (1) 打开文件 fp = open("ceshi1.txt",mode="w",encoding="utf-8")# 打开冰箱门 # (2) 写入内容 fp.write("把大象怼进去") # 把大象怼进去 # (3) 关闭文件 fp.close() # 把冰箱门关上
2.文件的读取操作
# (1) 打开文件 fp = open("ceshi1.txt",mode="r",encoding="utf-8") # (2) 读取内容 res = fp.read() # (3) 关闭文件 fp.close() print(res)
3.文件存储二进制字节流
二进制字节流:`用于传输数据或者存储数据的一种数据格式
b"abc" b开头的字节流要求数据只能是ascii编码中的字符,不能是中文
将字符串和字节流(Bytes流)类型进行转换 (参数写成转化的字符编码格式)
encode() 编码 将字符串转化为字节流(Bytes流)
decode() 解码 将Bytes流转化为字符串
data = b"abc" data = "中文".encode("utf-8") print(data,type(data)) res = data.decode("utf-8") print(res,type(res)) # utf-8下 一个中文占用3个字节 data = "中文".encode("utf-8") # 计算字节总大小 print(len(data)) # 把中字这个字节流进行反解恢复成原来中的字符 "中" res = b"\xe4\xb8\xad".decode() print(res)
4.文件存储二进制的字节流
如果存储的是二进制字节流,指定模式wb,不要指定encoding编码集,否则报错
fp = open("ceshi2.txt",mode="wb") strvar = "红鲤鱼绿鲤鱼与驴".encode("utf-8") fp.write(strvar) fp.close()
5.文件读取二进制的字节流
fp = open("ceshi2.txt",mode="rb") res = fp.read() fp.close() print(res) print(res.decode())
6.复制文件
所有的图片,音频,视频都需要通过二进制字节流来进行存储传输
先把原文件的二进制字节流读取出来
相对路径找集合.png 相对于当前3.py这个文件
fp = open("集合.png",mode="rb")
绝对路径找集合.png 从最底层一级一级往上找
fp = open(r"D:\python32_python\day01\集合.png",mode="rb") res = fp.read() fp.close() # 计算文件中的字节个数 => 文件大小 print(len(res)) # 在把二进制字节流写入到另外一个文件中,相当于复制 fp = open("集合2.png",mode="wb") fp.write(res) fp.close()
文件操作的扩展模式
(utf-8编码格式下 默认一个中文三个字节 一个英文或符号 占用一个字节)
read() 功能: 读取字符的个数(里面的参数代表字符个数)
注意:从当前光标往右边读
seek() 功能: 调整指针的位置(里面的参数代表字节个数)
seek(0) 把光标移动到文件的开头
seek(0,2) 把光标移动到文件的末尾
tell() 功能: 当前光标左侧所有的字节数(返回字节数)
1.r+ 先读后写
fp = open("ceshi3.txt",mode="r+",encoding="utf-8") # 先读 res = fp.read() # 在写 fp.write("ab") # 在读 fp.seek(0) # 通过seek把光标移动到开头 print(fp.read()) fp.close()
2.r+ 先写后读
fp = open("ceshi3.txt",mode="r+",encoding="utf-8") # 移动光标到最后,否则r模式下,原字符会被覆盖 fp.seek(0,2) # 先写 fp.write("cd") # 把光标移动到文件的开头 fp.seek(0) # 在读 res = fp.read() print(res) fp.close()
3.w+ 可读可写,清空重写(默认可以创建新的文件)
fp = open("ceshi4.txt",mode="w+",encoding="utf-8") fp.write("abc") fp.seek(0) print(fp.read()) fp.close()
4.a+ 可读可写,追加写入 (默认可以创建新的文件)
fp = open("ceshi5.txt",mode="a+",encoding="utf-8") fp.write("def") # 读内容 fp.seek(0) print(fp.read()) fp.close()
5.r+和a+区别
r+模式基于当前光标所在位置进行写入覆盖
a+模式会强制把光标放到文件末尾进行追加写入
# fp = open("ceshi5.txt",mode="r+",encoding="utf-8") fp = open("ceshi5.txt",mode="a+",encoding="utf-8") fp.seek(3) # 从头数 3个字节的位置 # fp.write("zxc") # 模式会强制把光标放到文件末尾进行追加写入 print(fp.read()) fp.close()
6.seek,tell,read之间的使用
fp = open("ceshi5.txt",mode="r+",encoding="utf-8") fp.seek(4) # tell 当前光标左边所有内容的字节数 res = fp.tell() print(res) # 在r+模式下 read(2) 代表读取2个字符 在rb模式下 read(2) 代表读取2个字节 fp.read(2) # 当前光标往右所有的字符内容 print(fp.tell()) fp.close()
7.注意点 (seek在移动时,又可能移动到某个汉字的字节中间,导致原字节无法解析)
fp = open("ceshi6.txt",mode="r+",encoding="utf-8") fp.seek(3) print(fp.read()) fp.close() # print("你".encode()) # b'\xe4\xbd\xa0'
8.with语法 自动实现文件关闭操作
方法一.读取二进制字节流
with open("集合2.png",mode="rb") as fp: res = fp.read() with open("集合3.png",mode="wb") as fp: fp.write(res)
方法二.继续简化
with open("集合3.png",mode="rb") as fp1 , open("集合4.png",mode="wb") as fp2 : res = fp1.read() fp2.write(res)
刷新缓冲区
刷新缓冲区 flush
当文件关闭的时候自动刷新缓冲区
当整个程序运行结束的时候自动刷新缓冲区
当缓冲区写满了 会自动刷新缓冲区
手动刷新缓冲区
fp = open("ceshi1.txt",mode="a",encoding="utf-8") fp.write("abc") # 手动刷新缓冲区,直接把内容写入到文件 fp.flush() while True: pass fp.close()
文件相关的函数
fp这个对象本身是迭代器,可以把文件中的内容按照换行一行一行遍历出来
fp = open("ceshi1.txt",mode="r",encoding="utf-8") #readable() 功能: 判断文件对象是否可读 print(fp.readable()) #writable() 功能: 判断文件对象是否可写 print(fp.writable()) # 遍历fp文件对象 for i in fp: print(i)
1.readline() 功能: 读取一行文件内容
with open("ceshi1.txt",mode="r",encoding="utf-8") as fp: res = fp.readline() print(res) res = fp.readline() print(res) res = fp.readline() print(res) res = fp.readline() print(res
(1)一次把所有内容都读取出来
with open("ceshi1.txt",mode="r",encoding="utf-8") as fp: # 先读取一行 res = fp.readline() # 判断是不是空,不是空在循环 while res: print(res) # 在读取一行,放到循环中判断. res = fp.readline()
(2)注意点:readline(读取的字符数)
with open("ceshi1.txt",mode="r",encoding="utf-8") as fp: """ 读取的字符数量 > 实际当前行字符数量的时候 => 按照当前行读取 读取的字符数量 < 实际当前行字符数量的时候 => 按照实际数量来读 """ res = fp.readline(300) print(res)
2.readlines() 功能:将文件中的内容按照换行读取到列表当中
lst_new = [] with open("ceshi1.txt",mode="r+",encoding="utf-8") as fp: lst = fp.readlines() for i in lst: lst_new.append(i.strip()) print(lst_new)
3.writelines() 功能:将内容是字符串的可迭代性数据写入文件中 参数:内容为字符串类型的可迭代数据
lst = ['床前明月光', '疑是地上霜', '举头望明月', '低头想家乡'] with open("ceshi2.txt",mode="w+",encoding="utf-8") as fp: fp.writelines(lst) # ### 实现效果:加入换行效果,并且插入一句话:王文真帅呀 , 插在低头想家乡的前面 lst_new = [] # 先把内容插入到原列表中 lst.insert(-1,"王文真帅呀") # 循环原列表,把每一个元素拼接\n , 放到新列表 for i in lst: lst_new.append(i + "\n") print(lst_new) # 把新列表中的每行内容插入到文件中 with open("ceshi2.txt",mode="w+",encoding="utf-8") as fp: fp.writelines(lst_new)
注意点,内容必须是字符串,不能是整型
lst = [1,2,3] with open("ceshi2.txt",mode="w+",encoding="utf-8") as fp: fp.writelines(lst)
4.truncate() 功能: 把要截取的字符串提取出来,然后清空内容将提取的字符串重新写入文件中 (字节)
with open("ceshi2.txt",mode="r+",encoding="utf-8") as fp: fp.truncate(3)
seek(字节)
truncate(字节)
read(字符/字节)
readline(字符/字节)
readable() 功能: 判断文件对象是否可读
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)