本节重点
- 装饰器
- 文件操作
一、装饰器
使用场景
在函数内部代码逻辑比较多的时候,想添加简易功能,但不便在函数内修改,容易破坏函数内的结构。
1、简单装饰器(前情提要)
定义:
本质上也是闭包,可以给原函数的功能进行扩展,不改变原函数定义与调用操作。
示例:
#在AAAA前面加上BBBBB,装饰器本质是一个闭包
def show4():
print("AAAAA")
def decorator(new_func):
def inner():
print("BBBBB")
new_func()
return inner
# 重新给show4赋值
show4 = decorator(show4)
show4()
#语法糖形式
@decorator
def show5():
print("CCCCCCCC")
show5()
'''
BBBBB
AAAAA
BBBBB
CCCCCCCC
'''
2、装饰器修饰带参数的函数
示例:
# 装饰器修饰带有参数的函数
def decorater(newfunc):
def inner(num1,num2):
print("计算两数之和")
return newfunc(num1,num2)
return inner
@decorater # 等价于 sum = decorater(sum)
def sum(num1,num2):
print(num1+num2)
sum(4,5)
'''
计算两数之和
9
'''
3、使用带有参数的装饰器
与上一条区分,这里是说装饰器本身接受参数,需要在原本的装饰器外部进行包裹。
示例:
# 装饰器自己带参数,要在装饰器外再包裹一层
def get_decorator(str):
def decorater(newfunc):
def inner(*args):
print(str)
return newfunc(*args)
return inner
return decorater
@get_decorator("计算两数之和")
def sum(num1,num2):
print(num1+num2)
@get_decorator("计算三数之和")
def sum2(num1,num2,num3):
print(num1+num2+num3)
sum(4,5)
sum2(6,7,8)
'''
计算两数之和
9
计算三数之和
21
'''
4、通用装饰器,可用于修饰任意函数
inner接收参数时使用不定长参数,即可。
# 使用通用装饰器,修饰任意函数,参数数量可变
def gdecorator(newfunc):
def inner(*args,**kwargs): # 不定长位置参数与不定长关键字参数
print("经通用装饰器修饰的求和函数")
return newfunc(*args,**kwargs)
return inner
@gdecorator
def sum1(num1,num2):
print(num1+num2)
return num1+num2
@gdecorator
def sum2(num1,num2,num3):
print(num1+num2+num3)
return num1+num2+num3
s1 = sum1(2,3)
s2 = sum2(3,4,5)
print(s1,s2)
二、文件
1、文件的访问模式
常用的为以下六种
- r:只读,当路径下没有此文件时,会报错
- w:只写,若路径下文件已存在,原有内容会被清空;原本不存在,会帮助创建空文件
- a:追加
rb、wb、ab,对应以上三种模式,只不过是以二进制形式操作。比较常用,可兼容不同数据,文本、图片,视频。
2、r,w,a示例
# ------------r模式---------------
file = open("1.txt","r",encoding = "utf-8") # 打开,文件不存在崩溃,为了兼容设置编码格式为utf-8
content = file.read() # 文件内容读出
print(content)
file.close() # 关闭,避免内存泄漏
# ------------w模式---------------
file = open("1.txt","w",encoding = "utf-8")
file.write("宋")
file.write("B")
file.write("K")
file.close() # 关闭
# ------------a模式---------------
file = open("1.txt","a",encoding = "utf-8") # 追加
file.write("宋")
file.write("B")
file.write("K")
file.close() # 关闭
3、rb,wb,ab示例
# rb模式
file = open("1.txt","rb") # 二进制格式不能给编码格式
file_data = file.read() # 文件数据读出
file_data.decode("utf-8") # 二进制方式解码
file.close()
#wb
file = open("1.txt","wb") # wb默认仍会覆盖
file_data = "BBBBBBBBBBB"
file_data.encode("utf-8") # 以二进制方式写入需要编码
file.write(file_data)
file.close() # 避免内存泄漏
#ab
file = open("1.txt","ab",encoding="utf-8") # 追加
file_data = "BBBBBBBBBBB"
file_data.encode("utf-8") # 以二进制方式写入需要编码
file.write(file_data)
file.close() # 避免内存泄漏
4、文件不同读取操作
- read():全部读取
- readline():只读取一行数据,遇到换行停止
- readlines():文件中数据按照每行读取,每行内容加换行符作为一个元素,存入列表
解码时可以遍历列表
文件指针:
可以先设置文件指针的位置,再读取文件,从而跳过文件的部分内容
file = open("1.txt","r",encoding = "utf-8")
file.tell()#:当前指针位置
file.seek(3)#:设置指针为3,先设置指针,再用file.read()读取
content = file.read() # 文件内容读出
print(content)
file.close() # 关闭,避免内存泄漏
模拟大文件的拷贝:
#1.打开源数据文件
src_file = open("1.txt","rb")
#2.指定写入的路径
dst_file = open("2.txt","wb")
#3.读取
while True:
file_data = src_file.read(1024) # 循环一次读1024个字节,一点一点读,避免大文件全部载入内存
if file_data:
dst_file.write(file_data)
else:
print("数据读取完成了")
break
#4.关闭
dst_file.close()
src_file.close()
文件与文件夹相关操作:
os、shutil模块
1、重命名文件
import os
file = open("1.txt","w",encoding = "utf-8")
file.write("Hello")
file.close()
# 修改文件的名字,如果文件不存在会报错
os.rename("1.txt","3.txt")
2、创建文件夹
os.mkdir("A") # 在当前路径下创建,如果已经存在A,会报错
os.rename("A","B") # 改名
3、查看当前路径
current_path = os.getcwd()
4、切换到指定路径
os.chdir("A") # 切换到A文件夹下
file = open("1.txt","w",encoding = "utf-8") # 在A下
5、删除文件
os.remove("A") # 若文件夹下有文件,不可以删除
os.remove("A/1.txt") # 删除文件夹内的文件
import shutil
shutil.rmtree("A") # 删除文件树,级联删除全部内容
网友评论