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, 写读【可写,可读】
一、 读:整体四种方法
r *****(五小种方式)
read() ***
read(n)
readline()
readlines()
for 循环 *****
rb ***
r+ *****
r+b:
mode可以不写,默认为r模式。
read(3):
1. 文件打开方式为文本模式时(r),代表读取3个字符
2. 文件打开方式为b模式时(rb),代表读取3个字节
其余的文件内光标移动都是以字节为单位的如:seek,tell,truncate
具体实例:
1、r:只读模式[默认模式,文件必须存在,不存在则抛出异常]
# 1,read 全部读取 f = open('文件操作1',encoding='utf-8',mode='r') content = f.read() print(content) f.close() # 2,read(n):按照字符读取 f = open('文件操作1',encoding='utf-8',mode='r') content = f.read(10) #r模式,按照字符读取(注意,文本的换行符虽然默认不显示,但是也是一个字符)。 print(content) f.close() # 3, readline 按行读取 f = open('文件操作1',encoding='utf-8',mode='r') print(f.readline()) #读取第一行 print(f.readline()) #读取第二行... f.close() # 4,readlines 按行全部读取,返回一个list f = open('文件操作1',encoding='utf-8',mode='r') content = f.readlines() print(content) f.close() # 5,for循环。一行一行输出 f = open('文件操作1',encoding='utf-8',mode='r') for line in f: print(line.strip()) 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+(读写):先读后追加。
f = open('文件操作1',encoding='utf-8',mode='r+') content = f.read() print(content) f.write('666') f.close() f = open('文件操作1',encoding='utf-8',mode='r+') content = f.read(3) #r+模式 n按字符读取 print(content) f.write('666') f.close() # 不读直接写:直接从开始覆盖 f = open('文件操作1',encoding='utf-8',mode='r+') f.write('深圳你好') 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('文件操作2', encoding='utf-8',mode='w+') f.write('深圳市南山区,福田区,罗湖区。。。') f.seek(3) # 调整光标 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
f = open('文件操作1',encoding='utf-8') #不写mode,默认是r if f.writable(): #判断是否可写 content = f.read() print(content) f.close() # seek:调整光标到开始seek(0) 调整光标到结尾seek(0,2)。0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。 f = open('文件操作1',encoding='utf-8') f.seek(6) # 按照字节去移动光标 content = f.read() print(content) f.close() f = open('文件操作1',mode='rb') print(f.read()) f.seek(6) # 按照字节去移动光标 content = f.read() print(content) f.close() # tell 告知光标的位置 ***** f = open('文件操作1',encoding='utf-8') f.seek(0,2) # 按照字节去移动光标 print(f.tell()) f.close() # truncate:要在writable模式下进行截取(可以在w使用,但是不推荐在w模式下使用)。 # 可在r+ a+ 等使用,表示对原文件进行截取 # 指定长度的话,就从文件的开头开始截断指定长度,其余内容删除; # 不指定长度的话,就从文件开头开始截断到当前位置,其余内容删除。 f = open('文件操作1',encoding='utf-8',mode='r+') print(f.truncate(6)) #以字节截取 f.close() # with open:过一段时间自动关闭文件 # 1,主动关闭文件句柄 with open('文件操作2',encoding='utf-8') as f1: print(f1.read()) # 2,开启多个文件句柄。 with open('文件操作2',encoding='utf-8') as f1,\ open('文件操作3',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', '小白的深度剖析')