文件处理过程
1.打开文件,得到文件句柄并赋值给一个变量
2.通过句柄对文件进行操作
3.关闭文件
f=open('test1.py','w',encoding='utf-8') f.write('1111222') f.close()
with open('test1.py','w',encoding='utf-8') as f: f.write('wwwwwwww\t\n') f.writelines(['qqq\t\n','www\t\n','666\t\n'])
文件的打开模式
文件句柄 = open('文件路径', '模式')
r 只读模式(文件不存在,抛异常)
w 只写模式(文件不存在新建,文件存在覆盖)
a 在文件的末尾追加内容(文件不存在新建,文件存在在末尾追加)
r+ 读写模式(打开文件光标在起始位置,因此从起始位置开始写入)
w+ 读写模式(文件不存在新建,文件存在覆盖)
a+ 读写模式(文件不存在新建,文件存在在末尾追加)
对于非文本文件,只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
rb
wb
ab
文件操作
1.r r+ rb 读的方法
f.read() #读取所有内容,光标移动到文件末尾
f.readline() #读取一行内容,光标移动到第二行首部
f.readlines() #读取每一行内容,存放于列表中
f.readable() #文件是否可读,可读返回True
文件内容如下:
f=open('r_opt.txt','r',encoding='utf-8') data=f.read() #读取所有内容,光标移动到文件末尾 print(data) data1=f.read() print(data1) #光标已移动到文件末尾,再从光标位置开始读取文件,所以读取内容为空 f.close()
f=open('r_opt.txt','r',encoding='utf-8') print(f.readline(),end='') #读取第一行内容,光标移动到第二行首部,end=''去掉末尾换行符 print(f.readline(),end='') #读取第二行内容,光标移动到第三行首部 f.close()
f=open('r_opt.txt','r',encoding='utf-8') data=f.readlines() #读取每一行内容,存放于列表中 print(data) #--> ['123\n', '456\n', 'hello\n', '你好'] f.close()
f=open('r_opt.txt','r',encoding='utf-8') print(f.readable()) #文件可读,返回True f.close() f1=open('w_opt.txt','w',encoding='utf-8') print(f1.readable()) #文件不可读,返回False f.close()
f=open('r_opt.txt','rb') data=f.read() print(data) # b'123\r\n456\r\nhello\r\n\xe4\xbd\xa0\xe5\xa5\xbd' print(data.decode('utf-8')) #--> 文件以utf8方式写入,rb以二进制模式读取文件内容时,需要进行解码 f.close()
f=open('r_opt.txt','r+',encoding='utf-8') # r+ 可读可写,因此可以调用write() data=f.read() print(data) f.write('edc66666') #read()读取后,光标移动到末尾,这时候调用write()写入时,是从光标位置开始写入 f.close()
2.w w+ wb 写的方法
f.writable() #文件是否可写
f.write('1111\n222\n') #针对文本模式的写,需要自己写换行符,一行行写入
f.writelines(['333\n','444\n']) #文件模式
f.write('1111\n222\n'.encode('utf-8')) #针对b模式的写,需要自己写换行符,指定编码类型
f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式,指定编码类型
f=open('w_opt.txt','w',encoding='utf-8') f.write('你好\n') #文件不存在新建,文件存在覆盖(清空,重新写入) f.write('hello world\n') #文件不存在新建,文件存在覆盖(清空,重新写入) f.close()
f=open('w_opt.txt','w',encoding='utf-8') f.writelines(['你好\n','我们\n','china']) f.close()
f=open('w_opt.txt','w+',encoding='utf-8') #w+ 可读可写,因此可以调用read() f.writelines(['你好\n','我们\n','china',]) f.seek(0) #写入后光标在文件内容末尾,seek(0)将光标移动至文件最初始位置 data=f.read() print(data) f.close()
f=open('w_opt.txt','wb') #b模式写入 f.write(bytes('你好哈哈',encoding='utf-8')) f.write('你好哈哈'.encode('utf-8')) f.close()
f=open('w_opt.txt','wb') #b模式写入 f.writelines(['你好哈哈\n'.encode('utf-8'),bytes('1234哈哈',encoding='utf-8')]) f.close()
3.a a+ ab追加写模式
f=open('w_opt.txt','a',encoding='utf-8') f.write('123456\n') #文件末尾追加内容 f.write('00000\n') f.close()
f=open('w_opt.txt','a+',encoding='utf-8') f.seek(0) #a+打开模式,光标在末尾,seek()移动光标至起始位置 data=f.read() print(data) f.close()
f=open('w_opt.txt','ab') #b模式追加写入 f.writelines(['笑嘻嘻\n'.encode('utf-8'),bytes('小秘密',encoding='utf-8')]) f.close()
4.光标的移动
read(x):
文件打开方式为文本模式时,代表读取x个字符
文件打开方式为b模式时,代表读取x个字节
f=open('w_opt.txt','r',encoding='utf-8') #文本模式 data=f.read(4) #-->你好哈哈 print(data) f.close() f=open('w_opt.txt','rb') #b模式 data=f.read(4) print(data) #-->b'\xe4\xbd\xa0\xe5' f.close()
seek():光标移动,以bytes为单位移动,有三种方式0,1,2,其中1,2必须在b模式下进行
seek(0):光标移动到文件最起始的位置
seek(10,1):光标当前位置向后移动10个字节
seek(-5,2):光标从末尾,倒序移动5个字节
tell():获取当前光标所在的位置(以字节为单位)
truncate() :截取文件,文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件,截取就无意义
f=open('w_opt.txt','a+',encoding='utf-8') f.truncate(13) #截取文件前13个字节 f.close()
练习
# 1. 文件a.txt内容:每一行内容分别为商品名字,价钱,个数,求出本次购物花费的总钱数 # apple 10 3 # tesla 100000 1 # mac 3000 2 # lenovo 30000 3 # chicken 10 3 with open('a.txt','r',encoding='utf-8') as shop: s=[] for i in shop.readlines(): #读取所有内容,结果-->列表 s.append(eval(i.split(' ')[1])*eval(i.split(' ')[2])) #split将列表元素(字符串)根据空格分隔,分隔的结果为字符串,eval函数将字符串的数据类型提取出来进行数学运算 print(sum(s))
# 2. 修改文件内容,把文件中的alice都替换成SB import os with open('source.txt','r',encoding='utf-8') as r_sou,open('tar.txt','w',encoding='utf-8') as w_tar: for line in r_sou: line=line.replace('alice','sb') w_tar.write(line) os.remove('source.txt') os.rename('tar.txt','source.txt')