一、文件处理流程
1、打开文件,得到文件句柄并赋值给一个变量
2、通过句柄对文件进行操作
3、关闭文件
#创建新文件名为可乐
f = open('可乐',encoding = 'utf-8') # f为句柄;encoding若不定义默认是Windows系统编码方式运行会出现乱码
data = f.read() #打印可乐文件中所有内容
print(datat)
f.close() #关闭文件
4、文件的获取方式有:
r,只读模式:默认模式;文件必须存在,不存在则抛出异常
w,只写模式:不可读;不存在则创建;存在则清空文件内容
x,只写模式:不可读;不存在则创建,存在则报错
a,追加模式:可读;不存在则创建;存在则追加内容
r+,读写:可读可写
w+,写读:可读可写
x+,写读:可读可写
a+,读写,可读可写
# 1)只读模式
f = open('可乐','r',encoding = 'utf-8')
#data = f.read() #若先打印read(),readline后打印为空
print(f.readable()) #True 判断获取方式是否可读
print(f.readline()) #打印文件的第一行,再写一遍读取行数自增一
print(f.readline()) #打印文件第二行
print(f.readlines()) #把文件内容以列表形式读取出来放在一个列表中
f.close()
# 2)只读模式
f = open('可乐','w',encoding = 'utf-8')
#data = f.read() #报错,此模式为只写模式
f.write('111\n') #所写内容自动保存在打开文件中,需要手动换行
print(f.writable()) #判断是否可写
print(f.writeline(['111\n','222\n'])) #以列表形式写参数,写的参数必须是字符串
# 3)追加模式
f = open('可乐','a',encoding = 'utf-8')
f.write('好喝') #与只写模式差不多,只是将参数写在文件最后一行不对文件进行清空
f.close()
# 4)r+模式
f = open('可乐','r+',encoding = 'utf-8')
data = f.resd()
print(data)
f.write('可口') #参数值直接写在文件后面且不换行
# 5)w+可读可写模式:把光标所在位置用参数覆盖
补:
src_f = open('可乐','r',encoding = 'utf-8')
data = src_f.readlines()
src_f.close()
print(data)
dat_f = open('可乐','w',encoding = 'utf-8')
dat_f.write(data[0]) #相当于取出第一行。重新赋给可乐文件,也相当于删除第二行
dat.close()
补:无需进行close()操作
# 1)
with open('kl','w') as dst_f: # as:句柄等号赋值转化为as
#对文件进行操作
# 2)对两个打开文件进行操作
#src_f = open('kl','r',encoding = 'utf-8')
#dat_f = open('kl','w',encoding = 'utf-8')
with open('kl','r',encoding = 'utf-8') as src_f,\
open('kl','w',encoding = 'utf-8') as dst_f:
data = scr_f.read()
dst_f.write(data)
6、b表示一字节的方式操作
rb或者r+b
wb或者w+b
xb或者x+b
ab或者a+b
注:以b的方式打开时,读取读取到的内容是字节型,写入时也需要提供字节类型,不能指定编码(以三进制处理的文件可跨平台)
补:在Windows中回车\r\n;Liuxe和uniex回车是\n
# 1)
f = open('可乐','rb') #b的方式不能指定编码
data = f.read()
print(data)
print(data.decode('utf-8')) #以utf-8的方式读取
f.close()
# 2)
f = open('可乐','wb') #b的方式不能指定编码
f.write(bytes('喝\n',encoding = 'utf-8'))
f.write('喝'.encode('utf-8'))
# 3)
f = open('可乐','ab') #b的方式不能指定编码
f.write('喝'.encode('utf-8'))
7、文件的其他处理方式
f = open(‘可乐’,‘r+’)
f = open('可乐','r+')
# 1)
print(f.closed) #判断文件是否关闭 False
# 2)
print(f.encoding) #文件打开的编码
# 3)
print(f.errors) #关于编码的报错
# 4)
f.flush() #将文件内容从内存刷到硬盘
# 5)
print(f.tell()) #显示光标当前所在位置
#在utf-8中回车占2个字节:\r\n-->python自动处理成\n-->用newline=''显示原始
f=open('可乐','r',encoding = 'utf-8',newline-='')
print(f.readlines()) #['喝可乐\r\n','hhh']
#若去掉newline='' ['喝可乐\n','hh']
# 6)
f.seek(3) #控制光标所在位置,从头开始算
print(f.tell()) #3
#注:read(3)代表读取3个字符,其余文件光标移动都是以字节为单位如:seek、tell、read、truncate
data = f.read(3)
print(data) #喝可乐
#7)
f.truncate() #文件截断
#补:seek()内容
#(1)
f.open('可乐','rb')
print('f.tell()') #0
f.seek(10,1)
print(f.tell()) #10
f.seek(3,1) #相对位置
print(f.tell()) #13
#(2)
f=open('可乐','rb')
print('f.tell()') #0
f.seek(-5,2) #倒着seek
print(f.read()) #b'\r\nhhh'
#(3)循环文件的方式
for i in f:
print(i) #文件内容一行一行输出
# 补:获取日志最后一行
if i in f:
offe = -10
whille True:
f.seek(off,2)
data = f.readlines()
if len(data)>1:
print('文件最后一行是%s',%(data[-1].decode('utf-8')))
break
offe *= 2