python之文件操作
一、文件基本操作介绍
文件路径:d:\a.txt
编码方式:utf-8,gbk,GB2312....
操作方式:只读,只写,写读,读写,追加 等。
报错原因:
UnicodeDecodeError: 'gb2312' codec can't decode byte 0xa6 in position 2: illegal multibyte sequence:
编码不一致,存储文件时编码与打开文件时编码不一致。
路径问题:
1,在路径的最前面加转义字符r:r'd:\a.txt'
2,把每个\ 变成 \\ :'d:\\a.txt'
绝对路径: d:\a.txt 从根目录开始找
相对路径: 从当前目录,当前文件夹开始找。
f = open(r'd:\a.txt',encoding='utf-8',mode='r') content = f.read() print(content) f.close()
'''
f:文件句柄,可以理解为变量。
open():python的内置函数(内部调用的是windows的系统命令)
文件操作的三部曲:
1,打开文件,产生文件句柄。
2,对文件句柄进行操作。
3,关闭文件句柄。
'''
文件打开模式:
1. 打开文件的模式有(默认为文本模式):
r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
w,只写模式【不可读;不存在则创建;存在则清空内容】
a, 只追加写模式【不可读;不存在则创建;存在则只追加内容】
2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作,
而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式
rb
wb
ab
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
3,'+'模式(就是增加了一个功能)
r+, 读写【可读,可写】
w+,写读【可写,可读】
a+, 写读【可写,可读】
4,以bytes类型操作的读写,写读,写读模式
r+b, 读写【可读,可写】
w+b,写读【可写,可读】
a+b, 写读【可写,可读】
二、 五种"读"的方法
1、r
r模式的读取方法大致有四种:
- read()
- read(n)
- readline()
- readlines()
- for循环读取
mode可以不写,默认为r模式。
read(3):
1. 文件打开方式为文本模式时(r),代表读取3个字符
2. 文件打开方式为b模式时(rb),代表读取3个字节
其余的文件内光标移动都是以字节为单位的如:seek,tell,truncate
具体实例:
"""a.txt内容如下: 你好啊 1234 """ # 1,read 全部读取 f = open('a.txt', encoding='utf-8', mode='r') content = f.read() print(content) # 你好啊 1234 f.close() # 2-1,read(n):r模式,按照字符读取 f = open('a.txt', encoding='utf-8', mode='r') content = f.read(3) # r模式,按照字符读取(注意,文本的换行符虽然默认不显示,但是也是一个字符)。 print(content) # 你好啊 f.close() # 2-2,read(n):rb模式,按照字节读取 f = open('a.txt', mode='rb') content = f.read(3) # rb模式,按照字节读取。 print(content) # b'\xe4\xbd\xa0' print(content.decode("utf-8")) # 你 f.close() # 3, readline 按行读取 f = open('a.txt', encoding='utf-8', mode='r') print(f.readline()) # 读取第一行:你好啊\n print(f.readline()) # 读取第二行: 1234 f.close() # 4,readlines 按行全部读取,返回一个list f = open('a.txt', encoding='utf-8', mode='r') content = f.readlines() print(content) # ['你好啊\n', '1234'] f.close() # 5,for循环,一行一行输出 f = open('a.txt', encoding='utf-8', mode='r') for line in f: print(line.strip()) # 你好啊 1234 f.close()
2、rb
f = open('美女1.jpg', mode='rb') content = f.read() print(content) f.close() f = open('文件操作1', mode='rb') content = f.read(9) # rb模式 n 按照字节读取。 print(content) f.close()
3、r+(读写)
注意:
读跟写的操作,都会移动光标,光标在哪,操作就从那里开始。
如果read()到了末尾,再写入数据,那么就会在末尾追加新的内容
但是,如果没有读,即光标在0的位置,那么就会0开始覆盖写入
"""a.txt内容如下: abcd1234efg """ # 先读取数据,把光标移动到末尾 f = open('a.txt', encoding='utf-8', mode='r+') content = f.read() print(content) # abcd1234efg f.write('666') # abcd1234efg666 f.close() # 先写入,再读 f = open('a.txt', encoding='utf-8', mode='r+') f.write('666') # 直接写(从索引0开始覆盖): 666d1234efg content = f.read() # 此时光标在索引为 2 ,即 第三个6那里 print(content) # 因此这里会从索引2开始读: d1234efg f.seek(0) # 移动光标到最开始的地方 content = f.read() print(content) # 666d1234efg f.close() # 不读直接写:从索引0开始覆盖 f = open('a.txt', encoding='utf-8', mode='r+') f.write("good") # good1234efg f.close()
三、 写
- w
- wb
- w+
- w+b
1、w 写
没有文件,则创建文件写;有此文件,则先清空后重新写。
f = open('文件操作2', encoding='utf-8',mode='w') f.write('深圳市南山区,福田区,罗湖区。。。') f.close()
2、wb
f = open('美女1.jpg',mode='rb') content = f.read() print(content) f1 = open(' 美女2.jpg',mode='wb') f1.write(content) f.close() f1.close()
3、w+: 写读
f = open('a.txt', encoding='utf-8',mode='w+') f.write('深圳市南山区,福田区,罗湖区。。。') f.seek(0) # 调整光标,若不调整,光标在文本最末尾,则读取不到数据 content = f.read() print(content) # 深圳市南山区,福田区,罗湖区。。。 f.close()
四、追加
- a
- ab
- a+
- a+b
a:
没有文件,创建文件也要写。
有文件,直接在文件的最后面追加。
f = open('文件操作3', encoding='utf-8',mode='a') f.write('\n南方水土好。。。') f.close()
五、 文件操作的其他方法
- read() *****
- write() *****
- close() *****
- seek() *****
- tell() *****
- readable() ****
- writable() **** 判断是否可写
- truncate() **
具体实例:
其他方法:readable ,writable,seek, tell, with open
"""a.txt内容 你是好人! """ f = open('a.txt', encoding='utf-8') # 不写mode,默认是r if f.readable(): # 判断是否可读 print("文件可读") # 文件可读 if f.writable(): print("文件可写") f.close() # seek(self, offset, whence), offset:移动多少字节,whence:从哪里开始移动,whence默认是0 # seek:whence的值可为:0,1,2 。0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。 # 但是必须要注意的是:Python3中 如果whence不为0 ,那么offset就必须为0。比如 seek(0, 2)代表文档末尾处 f = open('a.txt', encoding='utf-8') f.seek(3, 0) # 按照字节去移动光标 content = f.read() print(content) # 是好人! f.close() f = open('a.txt', mode='rb') print(f.read()) # b'\xe4\xbd\xa0\xe6\x98\xaf\xe5\xa5\xbd\xe4\xba\xba\xef\xbc\x81' f.seek(6) # 按照字节去移动光标 content = f.read() print(content) # b'\xe5\xa5\xbd\xe4\xba\xba\xef\xbc\x81' f.close() # tell 告知光标的位置 ***** f = open('a.txt', encoding='utf-8') f.seek(0, 2) # 按照字节去移动光标 print(f.tell()) # 15,代表光标在第15的字节处 f.close() # truncate:要在writable模式下进行截取(可以在w使用,但是不推荐在w模式下使用)。 # 可在r+ a+ 等使用,表示对原文件进行截取 # 指定长度的话,就从文件的开头开始截断指定长度,其余内容删除; # 不指定长度的话,就从文件开头开始截断到当前位置,其余内容删除。 f = open('a.txt', encoding='utf-8', mode='r+') f.truncate(6) # 以字节截取 print(f.read()) # 你是 f.close() # with open:过一段时间自动关闭文件 # 1,主动关闭文件句柄 with open('b.txt', encoding='utf-8') as f1: print(f1.read()) # 2,开启多个文件句柄。 with open('a.txt', encoding='utf-8') as f1, \ open('b.txt', encoding='utf-8', mode='w') as f2: print(f1.read()) f2.write('666666')
六、 文件的改
- 1,以读的模式打开原文件,产生一个文件句柄f1.
- 2,以写的模式创建一个新文件,产生一个文件句柄f2.
- 3,读取原文件内容,进行修改,并将修改后的写入新文件。
- 4,将原文件删除。
- 5,将新文件重命名成原文件。
# 方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器) # low版: import os with open('小白的深度剖析', encoding='utf-8') as f1,\ open('小白的深度解析.bak',encoding='utf-8',mode='w') as f2: old_content = f1.read() new_content = old_content.replace('小白','SB') f2.write(new_content) os.remove('小白的深度剖析') os.rename('小白的深度解析.bak', '小白的深度剖析') # 方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件 # 升级版: import os with open('小白的深度剖析', encoding='utf-8') as f1,\ open('小白的深度解析.bak',encoding='utf-8',mode='w') as f2: for line in f1: new_line = line.replace('小白','SB') f2.write(new_line) os.remove('小白的深度剖析') os.rename('小白的深度解析.bak', '小白的深度剖析')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix