【0808 | Day 11】文件的高级应用/修改以及函数的定义/使用/参数
文件的高级应用
一、三种模式
-
'r+'模式
with open('test.py','r',encoding = 'utf8') as fr: print(fr.writable()) fr.write('x=10') print(fr.write())
-
'w+'模式
with open('test.py','w+',encoding = 'utf8') as fr: print(fr.readable) fr.write('x=10') print(fr.read())
-
'a+'模式
with open('test.py','a+',encoding = 'utf8') as fr: print(fr.readable) print(fr.writable())
指针的应用
一、文件的内置方法
-
seek( offset,whence): offset代表文件指针的偏移量,单位是字节
with open('test.txt','r',encoding = 'utf8') as fr: fr.seek(1) #偏移1位,默认从文件头开始 fr.seek(0,2) #2表示从文件末开始,指针指向最末 fr.seek(1,0) #0表示从文件头开始,偏移1位
-
tell( ):每次统计都是从文件开头到当前指针所在位置
with open('test.txt','r',encoding = 'utf8') as fr: #fr.seek(2,0) print(fr.tell()) #从0到2,即2
-
read(n): 只有在模式下的read(n),n代表的是字符个数,除此之外,其他但凡涉及文件指针的都是字节个数(读取个数)
with open('test.txt','r',encoding = 'utf8') as fr: print(fr.read(n))
-
truncate(n): truncate(n)是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate()要在r+或a或a+等模式下测试效果。它的参照物永远是文件头。并且truncate()不加参数,相当于清空文件。
with open('test.txt','a',encoding = 'utf8') as fr: fr.truncate(2) #第二个字符后的内容清空 #注意:如果内容是“中奖啦”,2个字节一个字,如果truncate(3),则'中'之后乱码
二、相关知识:覆盖
#假设test.txt内容为:中中大大奖啦
with open('test.txt','rt',encoding = 'utf8') as fr: fr.seek(6,0) fr.write('小小小') #按理说应该变为“中中小小大大奖啦” print(fr.read()) #结果为“中中小小奖啦”
注意:因为插入字符会占用内存,所以系统一般都是覆盖。
文件修改的两种方式
一、方式一:
import os with open('test.py','r',encoding='utf8') as fr,\ open('test_swap.py','w',encoding='utf8') as fw: data = fr.read() data = data.replace('sb','dsb') fw.write(data) os.remove('test.py') #删除文件 os.rename('test_swap.py','test.py') #重命名文件
二、方式二:
import os with open('test.py','r',encoding='utf8') as fr,\ open('test_swap.py','w',encoding='utf8') as fw: for i in fr: i = i.replace('sb','dsb') fw.write(i) os.remove('test.py') #删除文件 os.rename('test_swap.py','test.py') #重命名文件
函数的定义
一、登录&注册
register( )注册:
usn = input("请输入注册姓名:").strip() pwd = input("请输入注册密码:").strip() with open('user_info.txt','a',encoding='utf8') as fa: fa.write(f'{usn}:{pwd}\n') for i in range(2): again_pwd = input("请再次输入密码:").strip() if again_pwd == pwd: print('恭喜你注册成功啦~') else: print("注册失败~") continue break
login( )登录:
inp_usn = input("请输入注册姓名:").strip() inp_pwd = input("请输入注册密码:").strip() with open('user_info.txt', 'r', encoding='utf8') as fr: data = fr.read() user_list = data.split("|") print(user_list) user_info = f'{inp_usn}:{inp_pwd}' if user_info in user_list: print('恭喜你啦~') else: print('登录失败~')
二、函数的使用
def 函数名(param1、param2……): #定义阶段只检测语法 """ 函数功能的描述信息 :param1:描述 :param2:描述 :return:返回值 """ code 1 code 2 code 3 ... return 返回值 函数名() #会显示语法错误
函数:注册
# 注册功能函数 def register(): """注册功能""" username = input('username: ').strip() pwd = input('password: ').strip() with open('38a.txt', 'a', encoding='utf8') as fa: fa.write(f"{username}:{pwd}\n") fa.flush() register() # 复用 register() register()
函数:登录
# 登录功能函数 def login(): """登录功能""" inp_username = input('username: ').strip() inp_pwd = input('password: ').strip() with open('38a.txt', 'rt', encoding='utf8') as fr: for user_info in fr: user_info = user_info.strip('\n') user_info_list = user_info.split(':') if inp_username == user_info_list[0] and inp_pwd == user_info_list[1]: print('login successful') break else: print('failed') login()
三、函数的返回
注意:print返回的值不可调用,而return的值可以继续调用
定义函数的三种形式
一、无参函数
可以单独使用,无变量
def add(x,y): print(int(x)+int(y)) x = input('number1: ') y = inout('number2: ') add(x,y)
二、有参函数
不能单独使用,要加参数(配件)
def func(): x = input('number1: ') y = inout('number2: ') print(int(x)+int(y)) func()
三、空函数
只是定义函数,什么都没有
def func(): pass
函数的参数
一、形参(位置形参)
定义阶段,占个位而已
def add(x,y): #此处的x, y是形参
二、实参(位置实参)
调用阶段,具有实际意义
def add(x,y): <代码块> add(x,y) #此处的x, y是实参
注意:位置形参和位置实参是一一对应的。
三、关键字实参
注意:函数的参数尽量不超过两个
def shopping(name = 'Nick'): goods_dict = {1:'car',2:'house',3:'job'} print(f'恭喜{name},得到一个{goods_dict[3]}!') shopping() #不输入 shopping() #输入'John',将会取代默认形参 #恭喜Nick,得到一个job! #恭喜John,得到一个job! #关键字实参 def shopping(x,name = 'Nick'): #默认形参放后面 goods_dict = {1:'car',2:'house',3:'job'} print(f'恭喜{name},得到一个{goods_dict[3]}!') shopping(name = 'Nick',x= 1) shopping(1,'Nick')