二进制模式下的读写操作
with open('a.txt','r',encoding='utf-8') as f: #helloworld
print(f.read(5)) #hello
t模式下,f.read()如果不指定参数,默认一次性读取所有。
f.read(5)如果指定参数,返回的就是字符的个数
with open('a.txt','rb')as f: #helloworld
print(f.read(5)) #b'hello'
b模式下,f.read()如果指定了参数,返回的就是字节个数
控制文件内指针移动
0:默认的模式,代表指针移动的字节数以文件开头为参照的,它能够在t模式和b模式
with open('a.txt','r',encoding='utf-8')as f: #helloworld
f.seek(5,0)
print(f.read()) #world
with open('a.txt','rb')as f:#helloworld
f.seek(5,0)
print(f.read().decode('utf-8'))#world
1:该模式代表指针移动的字节数是以当前位置为参照物的,只支持b模式,t模式不行
with open('a.txt','rb')as f: #helloworld
print(f.read(1)) #b'h'
f.seek(5,1)
print(f.read().decode('utf-8')) #orld
2:该模式代表指针移动的字节数是以文件末尾为参照的
with open('a.txt','rb')as f:#helloworld
print(f.read(1)) #b'h'
f.seek(-1,2)
print(f.read().decode('utf-8')) #d
小练习:实现动态查看最新一条的效果
import time#导入一个时间模块
with open('a.txt','rb')as f:
f.seek(0,2)
while True:
line=f.readline()
if len(line)==0:
#没有内容
time.sleep(0.3)
#睡眠0.3秒
else:
print(line.decode('utf-8'),end='')
文件修改
文件db.txt内容如下
张一蛋 山东 179 49 12344234523
李二蛋 河北 163 57 13913453521
王全蛋 山西 153 62 1865143342
文件修改方式一
将文件内容发一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件
with open('db.txt','rt',encoding='utf-8')as f: #读取文件
data=f.read()
with open('db.txt','wt',encoding='utf-8')as f: #写入文件
f.write(data.replace('张一蛋 ','sb'))
文件修改方式二
以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名
import os
with open('db.txt','rt',encoding='utf-8')as read_f,\
open('.db.txt','wt',encoding='utf-8')as write_f:
for line in read_f:
write_f.write(line.replace('sb','hb'))
os.remove('db.txt') #删除原文件
os.rename('.db.txt.swap','db.txt') #改名字
函数
函数主要来解决代码冗余性问题,函数就是类似于一个工具,内部封装了一些功能,哪里需要就在哪里使用。
函数语法结构
def my_len(a, b):
'''函数注释'''
# 函数体
return '123'
函数的定义与调用(重点)
1.函数必须先定义后使用
2.函数在定义阶段只检测语法是否错误,不检测逻辑是否有问题
3.逻辑错误在调用阶段检测
4.函数调用后才会执行代码块
如何调用函数
函数名()
函数的分类
1.内置函数
len print input等
2.无参函数
def my_len():
pass
my_len()
3.有参函数
def my_len(a,b):
pass
my_len(a,b)