字符串的格式化有两种方式:百分号方式(较老)、format方式(先进)
1、百分号方式
%s万能的可以接收任意类型
msg = "i am %s, my hobby is %s" %('lif','alex')
print(msg)
%d只接收int数字类型
msg = "i am %s, age is %d" %('alex',18)
msg = "i am %(name)s, age is %(old)d"%({'name':'alex','old':18}) #传字典
print(msg)
%f只接收float数字类型,%.2f表示保留两位小数
tpl = 'percent %.2f'%99.6745
tpl = 'percent %(pp).2f'%({'pp':99.4567}) #传字典
print(tpl)
2、format方式,常用方式
位置参数传入,必须一一对应({}什么也不填,或者填传入位置)
msg = "i am {}, age is {}, my hobby is {}".format('alex',18,'footbal')
msg = "i am {0}, age is {1}, my hobby is {2}".format('alex',18,'footbal')
msg = "i am {0}, age is {1}, my hobby is {2}".format(*['alex',18,'footbal'])
print(msg)
赋值形式或**字典的形式传入
tpl = "i am {name}, age is {age}, my hobby is {hobby}"
msg = tpl.format(name="alex",age=18,hobby="footbal")
msg = tpl.format(**{'name':'alex','age':18,'hobby':'ootbal'})
print(msg)
tpl = "i am {0[0]}, age is {0[1]}, my hobby is {0[2]}"
msg = tpl.format(['alex',18,'footbal'])
print(msg)
设定参数要求
msg = "i am {:s}, age {:d}, money {:.2f}".format('alex',18,97.8654)
print(msg)
msg = "i am {name:s}, age {age:d}".format(name='alex',age=18)
print(msg)
三步骤:打开文件,得到文件句柄并赋值给一个变量;通过句柄对文件操作;关闭文件
open()函数打开文件时,如果不指定打开方式,会默认使用操作系统的,操作系统的是GBK,
因此用什么编码保存的就用什么编码打开。
1、文件模式有(默认文本模式):
r,只读模式(默认模式,文件必须存在,不存在则抛出异常)
w,只写模式(不可读,不存在则创建,存在则清空内容,本质是覆盖)
a,追加模式(不可读,不存在则创建,存在则追加内容,从光标最后位置往后写)
f = open('a.txt','w',encoding='utf8')
f.write('5555') #write必须是字符串,并且只能有一个参数
f.writelines(['5555\n','6666\n']) #writelines 参数是列表且里边必须是字符串
f.close()
f = open('a.txt','r',encoding='utf8')
print(f.read())
f.close()
with open('a.txt','a',encoding='utf8') as f:
f.write('aaaaaa\n')
with open('a.txt','r',encoding='utf8') as f,\
open('a.txt','w',encoding='utf8'):
2、非文本文模式(b模式)
b模式:b表示以字节方式操作(读,写和追加)
注:以b方式打开时,不能指定编码,读取的内容是字节类型,写入时也需提供字节类型。
rb,只读模式(默认模式,文件必须存在,不存在则抛出异常)
wb,只写模式(不可读,不存在则创建,存在则清空内容)
ab,追加模式(不可读,不存在则创建,存在则追加内容)
with open('a.txt','r',encoding='utf8') as f:
data = f.read()
print(data)
f = open('b.txt','wb')
f.write('5555\n'.encode('utf-8')])
f.writelines([bytes('6666\n',encoding='utf-8'),'5555\n'.encode('utf-8')])
f.close()
字符串 ---encode---->bytes
bytes-----decode---->字符串
3、+同时读写某个文件
r+,读写,默认从开头开始,本质是覆盖
w+,写读,默认从开头开始,本质是覆盖
a+,写读,从光标最后位置往后写
f = open('a.txt','r+',encoding='utf8')
f.write('asdfg\n')
f.close()
f = open('a.txt','w+',encoding='utf8')
f.write('asdfg\n')
f.close()
f = open('a.txt','a+',encoding='utf8')
f.write('66666asdfg\n')
f.close()
4、文件操作的其他方式
with open('a.txt','r',encoding='utf8',) as f:
data = f.encoding #打开源文件的编码方式
data = f.flush() #刷新文件
data = f.tell() #获取当前光标所在的
f.seek(3) #移动光标的位置,以字符为单位
data = f.read()
print(data)
seek(10,0) 0:相对初始位置,默认从开头位置
seek(10,1) 1:相对上次光标所在的位置
seek(-10,2) 2:相对末尾,从末尾倒着移动光标,因此seek中是-10,
虽然倒着移动光标,但read()读取时仍然从光标位置往后读
当seek中是1和2时,必须是带b即b模式,末尾不用带encoding=''。
f.truncate(10) #从开头开始算,将文件只保留从0-10个字节的内容,
文件必须以写方式打开,但是w和w+除外(清空)
# 循环文件的推进方式
f = open('b.txt','rb')
for i in f:
print(i)
找出文件的最后一行(节省内存):
f = open('日志文件','rb')
offs = -10
while True:
f.seek(offs,2)
data = f.readlines()
if len(data)>1:
print(data[-1].decode('utf8'))
break
offs*=2
f.close()