文件处理基本流程
1)打开文件,找到文件句柄并赋值给一个变量
2)通过句柄对文件进行操作
3)关闭文件
1、文件格式为“utf-8”
#新建一个文件,命名锦觅,文件内容如下: 香蜜沉沉烬如霜 哪吒 陈情令 亲爱的 热爱的
#'gbk' codec can't decode byte 0xac in position 14: illegal multibyte sequence,锦觅文件中字符串存在硬盘上是二进制,字符串到二进制中间有字符编码,看右下角是utf-8 #pycharm3是utf-8编码,但是open函数不是,该函数会检索当前系统的编码,当前是windows系统,为gbk;这次打开以文件存的编码打开;mac是utf-8 #若文件是gbk格式存在硬盘,打开也应是gbk #打开是解码过程,存内存是编码 #在锦觅同一个路径再建一文件,内容如下,运行 f=open("锦觅",encoding="utf-8")#得到一个文件句柄赋值给f data=f.read() print(data) f.close() #香蜜沉沉烬如霜 # 哪吒 # 陈情令 # 亲爱的 # 热爱的
2、文件格式为“gbk”
#新建文件名“呼家楼”,格式为gbk f=open("呼家楼") data=f.read() print(data) #蒲黄榆
3、f=open("锦觅",encoding="utf-8"),解释如下:
f是句柄open是应用程序,通过操作系统要了句柄;举例:f相当于渔网,文件相当于一堆鱼,去操作系统捞鱼,f就相当于文件句柄;f.read()相当于捞鱼;f是open函数程序提供,open去调操作系统,实际是由操作系统去返回f,f去操作硬盘f.close()相当于回收渔网;若一直打开不关闭,一直占着资源
一、读的方法,r
1、readable,判断是否只读
# 文件打开模式,读r、写w,默认打开是只读模式 f=open("锦觅","r",encoding='utf-8') #是否只读 print(f.()) f.close() #True f=open("锦觅","w",encoding='utf-8') #是否只读 print(f.readable()) f.close() #False
2、readline一次读一行
#read读取全部; readline一次读一行;end=''是去掉换行;超行时不报错 f=open("锦觅","r",encoding='utf-8') #是否只读 print('1',f.readline(),end='') print('2',f.readline()) print('3',f.readline()) print('4',f.readline()) print('5',f.readline()) print('6',f.readline()) print('7',f.readline()) f.close() #1 香蜜沉沉烬如霜 # 2 哪吒 # # 3 陈情令 # # 4 亲爱的 # # 5 热爱的 # 6 # 7
f=open("锦觅","r",encoding='utf-8') #是否只读 f.read()#已经读取完,光标已经在最后位置,f.readline()再读取时没有内容 print('1',f.readline(),end='') f.close() #1
3、readlines
#将文件所有内容放在列表中 f=open("锦觅","r",encoding='utf-8') data=f.readlines() print(data) f.close() #['香蜜沉沉烬如霜 ', '哪吒 ', '陈情令 ', '亲爱的 ', '热爱的']
二、写的方法w
1、w写,若文件存在,先清空;若不存在,先新建个新文档; 换行
# w写,若文件存在,先清空;若不存在,先新建个新文档 f=open("锦觅","w",encoding="utf-8") f.write("《锦觅》文档中显示如下:111") f.write("222") f.write("333 444 ") f.write("555 ") f.write("666") # 《锦觅》文档中显示如下:111222333 # 444 # 555 # 666
2、writable()#是否是可写的
3、writelines,只能写入字符串,否则报错
# writelines以列表形式写入 f=open("锦觅","w",encoding="utf-8") data=f.writelines(["111 ","222"]) print(data) f.close() # 111 # 222
三、追加模式:a
代码运行前文件内容如下:
香蜜沉沉烬如霜 哪吒 陈情令
#a模式写到最后 f=open("锦觅","a",encoding="utf-8") f.write("在最后")
运行后文件内容如下:
香蜜沉沉烬如霜 哪吒 陈情令在最后
四、r+既能读又能写。当先读时,写在后面;当先写时,写在前面,覆盖原有文字
# r+既能读又能写、
#当先读时,写在后面
代码运行前文件内容如下:
《锦觅》中结果为
亲爱的
热爱的在最后在最后在最后
f=open("锦觅","r+",encoding="utf-8") data=f.read() print(data) f.write("锦觅") 输出结果为 #亲爱的 #热爱的在最后在最后在最后
代码运行后文件内容如下:
亲爱的
热爱的在最后在最后在最后锦觅
代码运行前文件内容如下:
亲爱的
热爱的在最后在最后在最后锦觅
#当先写时,写在前面,覆盖原有文字
f=open("锦觅","r+",encoding="utf-8") f.write("杨紫")
代码运行后文件内容如下:
杨紫的
热爱的在最后在最后在最后锦觅
五、文件修改
# 将文件内容从一个文档搬到另一个文档,将“锦觅”中内容搬到“锦觅_new” src_f=open("锦觅",'r',encoding="utf-8") data=src_f.read() src_f.close() dst_f=open("锦觅_new",'w',encoding="utf-8") dst_f.write(data) dst_f.close()
修改前锦觅中内容: 香蜜沉沉烬如霜 哪吒 陈情令 #只保存第一行 src_f=open("锦觅",'r',encoding="utf-8") data=src_f.readlines() src_f.close() dst_f=open("锦觅",'w',encoding="utf-8") # dst_f.writelines(data) dst_f.write(data[0]) dst_f.close() 修改后内容 香蜜沉沉烬如霜
六、with关键字,不用手动close文件
with open ("锦觅","w",encoding="utf-8") as f: f.write("陈情令 ") 运行后,锦觅文件结果 陈情令
# with打开两个文件 with open("锦觅","r",encoding="utf-8") as src_f, open("锦觅_new","w",encoding="utf-8") as dst_f: data=src_f.read() dst_f.write(data) 运行后,锦觅文件中内容复制到锦觅_new中
回顾:
- map函数运行原理:将l中的可迭代对象进行for循环,得出l中每一个值交给前面的方法处理
l=[1,2,3,4,5] print(list(map(str,l))) #['1', '2', '3', '4', '5']
- reduce
from functools import reduce l=[1,2,3,4,5] res=reduce(lambda x,y:x+y,l,3) print(res) # 18
- filter
name=["alex_sb","yangzi"] res=filter(lambda x:not x.endswith("sb"),name) print(list(res)) #['yangzi']
- 文件处理:r,w,a
f=open("锦觅","r",encoding="utf-8") print(f.read()) f.close()
- 用二进制处理文件,1、由于文件中不仅仅只有文本rt(默认是文本),可能还会存在图片、视频;2、b形式可以跨平台;文件处理时是二进制,在win,linux系统均可用
- rb以字节的方式写文件,b方式不能指定编码
# win系统,回车 ;linux系统 ;b读出来的是字节 f=open("小猴子","rb") data=f.read() print(data) #b'000 111 222 xe4xbdxa0xe5xa5xbd' f=open("小猴子","rb") data=f.read() # 字符串------encode--------二进制 # 二进制------decode--------字符串 print(data.decode("utf-8")) # 000 # 111 # 222 # 你好
- wb,
f=open("小猴子1",'wb') f.write(bytes( "1112 ",encoding="utf-8"))
#小猴子1文件内容
#1112
- ab,文件的最后一个位置输入
f=open("小猴子1",'ab') f.write(bytes( "31112 ",encoding="utf-8"))
#小猴子1文件内容
#1112
#31112
文件方法
- closed,是否关闭
f=open("小猴子1",'w') print(f.closed) #False
- encoding
# f.encoding,文件打开的编码 f=open("小猴子1",'w',encoding='gb2312') print(f.encoding) #gb2312
小猴子中内容: 111 222 你好 代码运行 f=open("小猴子","r",encoding="gbk") data=f.read() print(data) #111 #222 #浣犲ソ
- flush,刷新
- tell-当前光标的位置
小猴子文件内容
香蜜
哪吒
陈情令肖战
#当前光标所在的位置,只有read(3)代表读取3个字符,其余的文件光标都是以字节为单位如seek,tell,read f=open("小猴子",'r',encoding='utf-8') print(f.tell()) f.readline() print(f.tell()) # 0 # 7
- seek光标移动,配合tell;seek(1)报错
f=open("小猴子",'r',encoding='utf-8') f.seek(3) print(f.tell()) print(f.readlines()) # 3 # ['蜜 ', '哪吒 ', '陈情令肖战']
- read读取字符,read(1)不报错
f=open("小猴子",'r',encoding='utf-8') data=f.read(4) print(data) #香蜜 # 哪
- truncate截取,在文件中截取字段
f=open("小猴子",'r+',encoding='utf-8') data=f.truncate(10) print(data) # 小猴子文件中显示 # 香蜜 # 哪
- seek
# seek,seek几个字节 f=open("小猴子",'r',encoding='utf-8') print(f.tell()) f.seek(10) print(f.tell()) print(f.seek(3)) # 0 # 10 # 3
# seek(10,0)从文件开头 f=open("小猴子",'r',encoding='utf-8') print(f.tell()) f.seek(10,0) print(f.tell()) print(f.seek(3,0)) # 0 # 10 # 3
# seek(10,1)相对位置报错,因为seek字节.故采用“rb”模式 f=open("小猴子",'rb') print(f.tell()) f.seek(10,1) print(f.tell()) print(f.seek(3,1)) # 0 # 10 # 13
# seek(10,2)从文件尾部开始读取 f=open("小猴子",'rb') print(f.tell()) f.seek(-7,2) data=f.read() print(data) # 0 # b'xa4xe8x82x96xe6x88x98'
呼家楼文件内容: 2019/10/29 alex 登录1 2019/10/30 alex 登录2 2019/10/31 alex 登录3 2019/11/1 alex 登录4 2019/11/2 alex 登录5失败 # 读日志,循环文件的推荐方式 f=open("呼家楼","rb") for i in f: offs=-10#大致估算一行多少个字节 while True: f.seek(offs,2) data=f.readlines() if len(data)>1: print("文件的最后一行是%s" %(data[-1].decode("utf-8"))) break offs*=2 # 文件的最后一行是2019/11/2 alex 登录5失败