文章目录
- 236_了解高阶函数
- 237_abs和round函数的应用
- 238_体验高阶函数的思路分析
- 239_体验高阶函数的代码实现
- 240_内置高阶函数之map
- 241_内置高阶函数之reduce
- 242_内置高阶函数之filter
- 247_读取函数之read
- 248_读取函数之readlines
- 249_读取函数之readline
- 251_访问模式特点02之代码测试
- 252_seek函数
- 253_文件备份的作用
- 254_文件备份思路分析
- 255_文件备份之接收用户输入
- 256_文件备份之规划文件名
- 257_文件备份之数据写入
- 258_文件备份之限制有效文件名备份
- 259_文件操作函数
- 260_文件夹操作函数之创建和删除
- 261_文件夹操作函数之路径相关函数
- 262_文件夹操作函数之rename
- 263_批量重命名之添加字符串
- 264_批量重命名之添加和删除字符串
- 265_文件总结
236_了解高阶函数
高阶函数:把函数作为参数传入,这样的函数称为高阶函数,高阶函数是函数式编程的体现。函数式编程就是指这种高度抽象的编程范式。
237_abs和round函数的应用
4.1 体验高阶函数
在python中,abs()函数可以完成对数字求绝对值计算。
abs(-10) #10
round()函数可以完成对数字的四舍五入计算。
round(1.2) #1
round(1.9) #2
abs()和round()函数的应用,代码实现如下所示:
#abs():绝对值
print(abs(-10))
#round():四舍五入
print(round(1.2))
print(round(1.9))
运行结果:
238_体验高阶函数的思路分析
需求:任意两个数字,按照指定要求整理数字后再进行求和计算。
- 方法1
def add_num(a,b):
return abs(a) + abs(b)
result = add_num(-1,2)
print(result) # 3
- 方法2
def sum_num(a,b,f):
return f(a) + f(b)
result = sum_num(-1,2,abs)
print(result) # 3
注意:两种方法对比之后,发现方法2的代码会更加简洁,函数灵活性更高。
函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快。
239_体验高阶函数的代码实现
#需求:任意两个数字,先进行数字处理(绝对值或四舍五入),然后再求和计算
#1.写法
def add_num(a,b):
#绝对值
return abs(a) + abs(b)
result = add_num(-1.1,1.9)
print(result)
#2.写法二:高阶函数:f是第三个参数,用来接收将来传入的函数
def sum_num(a,b,f):
return f(a) + f(b)
result1 = sum_num(-1,5,abs)
print(result1)
result2 = sum_num(1.1,1.3,round)
print(result2)
240_内置高阶函数之map
4.2 内置高阶函数
4.2.1 map()
map(func,lst),将传入的函数变量func作用到lst变量的每个元素中,并将结果组成新的列表(Python2)/迭代器(Python3)返回。
需求:计算list1序列中各个数字的2次方。
list1 = [1,2,3,4,5]
def func(x):
return x **2
result = map(func,list1)
print(result)
print(list(result))
内置高阶函数之map(),代码实现如下所示:
#1.准备列表数据
list1 = [1,2,3,4,5]
#2.准备2次方计算的函数
def func(x):
return x **2
#3.调用map
result = map(func,list1)
#4.验收成果
print(result)
print(list(result))
运行结果:
241_内置高阶函数之reduce
4.2.2 reduce()
reduce(func,lst),其中func必须有两个参数,每次func计算的结果继续和序列的下一个元素做累积计算。
注意:reduce()传入的参数func必须接收2个参数。
需求:计算list1序列中各个数字的累加和。
import functools
list1 = [1,2,3,4,5]
def func(a,b):
return a + b
result = functools.reduce(func,list1)
print(result) # 15
内置高阶函数之reduce,实现代码如下所示:
list1 = [1,2,3,4,5]
#1.导入模块
import functools
#2.定义功能函数
def func(a,b):
return a + b
#3.调用reduce作用:功能函数计算的结果和序列的下一个数据做累计计算
result = functools.reduce(func,list1)
print(result)
运行结果:
242_内置高阶函数之filter
4.2.3 filter()
filter(func,lst)函数用于过滤序列,过滤掉不符合条件的元素,返回一个filter对象。如果要转换为列表,可以使用list()来转换。
list1 = [1,2,3,4,5,6,7,8,9,10]
def func(x):
return x % 2 ==0
result = filter(func,list1)
print(result)
print(list(result))
内置高阶函数之filter,代码实现情况如下所示:
list1 = [1,2,3,4,5,6,7,8,9,10]
#1.定义功能函数:过滤序列中的偶数
def func(x):
return x % 2 ==0
#2.调用filter
result = filter(func,list1)
print(result)
print(list(result))
运行结果:
247_读取函数之read
2.1.2.2 读
- read()
文件对象.read(num)
num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据。
f = open('1.txt','r')
#文件内容如果换行,底层有\n,会有一个字节占位,导致read书写参数读取出来的和眼睛看到的个数参数不匹配
#read不写参数表示读取所有;
#print(f.read())
print(f.read(10))
f.close()
运行结果:
248_读取函数之readlines
readlines()
readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。
f = open('test.txt')
content = f.readlines()
print(content)
#关闭文件
f.close()
读取函数之readlines,代码实现如下所示:
f = open('1.txt','r')
con = f.readlines()
print(con)
f.close()
运行结果:
249_读取函数之readline
readline()
readline()一次读取一行内容。
f = open('test.txt')
content = f.readline()
print(f'第一行:{content}')
content = f.readline()
print(f'第二行:{content}')
#关闭文件
f.close()
读取函数之readline,代码实现如下所示:
f = open('1.txt','r')
con = f.readline()
print(con)
con = f.readline()
print(con)
con = f.readline()
print(con)
f.close()
运行结果:
251_访问模式特点02之代码测试
"""
测试目标
1.r+ 和 w+ a+区别;
2.文件指针对数据读取的影响
"""
#r+:r没有该文件则报错:文件指针在开头,所以能读取出来数据
#f = open('1.txt','r+')
#f = open('100.txt','r+')
#a+:没有该文件会新建文件;文件指针在结尾,无法读取数据(文件指针后面没有数据)
#f = open('1.txt','a+')
f = open('100.txt','a+')
con = f.read()
print(con)
f.close()
252_seek函数
2.1.2.3 seek()
作用:用来移动文件指针。
语法如下:
文件对象.seek(偏移量,起始位置)
起始位置:
- 0:文件开头
- 1:当前位置
- 2:文件结尾
"""
语法:文件对象.seek(偏移量,起始位置) 0:开头 1:当前位置 2:结尾
目标:
1.r 改变文件指针位置:改变读取数据开始位置或把文件指针放结尾(无法读取数据)
2.a 改变文件指针位置,做到可以读取出来数据
"""
f = open('1.txt','r+')
f.seek(2,0)
con = f.read()
print(con)
f.close()
运行结果:
a+访问模式读取数据,文件指针在结尾,无法读取数据,情况显示如下所示:
"""
语法:文件对象.seek(偏移量,起始位置) 0:开头 1:当前位置 2:结尾
目标:
1.r 改变文件指针位置:改变读取数据开始位置或把文件指针放结尾(无法读取数据)
2.a 改变文件指针位置,做到可以读取出来数据
"""
#f = open('1.txt','r+')
#1.改变读取数据开始位置
#f.seek(2,0)
#1.把文件指针放结尾(无法读取数据)
#f.seek(0,2)
f = open('1.txt','a+')
con = f.read()
print(con)
f.close()
运行结果:
a+访问模式,利用seek()函数读取数据,情况显示如下所示:
"""
语法:文件对象.seek(偏移量,起始位置) 0:开头 1:当前位置 2:结尾
目标:
1.r 改变文件指针位置:改变读取数据开始位置或把文件指针放结尾(无法读取数据)
2.a 改变文件指针位置,做到可以读取出来数据
"""
#f = open('1.txt','r+')
#1.改变读取数据开始位置
#f.seek(2,0)
#1.把文件指针放结尾(无法读取数据)
#f.seek(0,2)
#2.a 改变文件指针位置,做到可以读取出来数据
f = open('1.txt','a+')
#f.seek(0,0)
f.seek(0)
con = f.read()
print(con)
f.close()
运行结果:
253_文件备份的作用
需求:用户输入当前目录下任意文件名,程序完成对该文件的备份功能(备份文件名为XX[备份]后缀,例如:test[备份].txt)。
254_文件备份思路分析
需求:用户输入当前目录下任意文件名,程序完成对该文件的备份功能(备份文件名为XX[备份]后缀,例如:test[备份].txt)。
3.1 步骤
1.接收用户输入的文件名
2.规划备份文件名
3.备份文件写入数据
255_文件备份之接收用户输入
3.2 代码实现
1.接收用户输入目标文件名
old_name = input('请输入您要备份的文件名:')
2.规划备份文件名
2.1 提取目标文件名后缀
2.2 组织备份的文件名,xx[备份]后缀
#1.用户输入目标文件
old_name = input('请输入您要备份的文件名:')
print(old_name)
print(type(old_name))
#2.规划备份文件的名字
#3.备份文件写入数据(数据和原文件一样)
运行结果:
256_文件备份之规划文件名
2.规划备份文件名
2.1 提取目标文件名后缀
2.2 组织备份的文件名,xx[备份]后缀
#2.1 提取文件后缀点的下标
index = old_name.rfind('.')
#print(index) #后缀中 . 的下标
#print(old_name[:index]) #源文件名(无后缀)
#2.2 组织新文件名 旧文件名 + [备份] +后缀
new_name = old_name[:index] + '[备份]' + old_name[index:]
#打印文件名(带后缀)
#print(new_name)
#1.用户输入目标文件
old_name = input('请输入您要备份的文件名:')
print(old_name)
print(type(old_name))
#2.规划备份文件的名字
#2.1 提取后缀 -- 找到名字中的点 -- 最右侧的点才是后缀的点 -- 字符串查找某个子串rfind
index = old_name.rfind('.')
#print(index)
#2.2 组织新名字 = 原名字+ [备份]+ 后缀
#原名字就是字符串中的一部分子串 -- 切片[开始:结束:步长]
print(old_name[:index])
print(old_name[index:])
new_name = old_name[:index]+ '[备份]'+ old_name[index:]
print(new_name)
#3.备份文件写入数据(数据和原文件一样)
运行结果:
257_文件备份之数据写入
3.备份文件写入数据
3.1 打开源文件 和 备份文件
3.2 将源文件数据写入备份文件
3.3 关闭文件
#3.1 打开文件
old_f = open(old_name,'rb')
new_f = open(new_name,'wb')
#3.2 将源文件数据写入备份文件
while True:
con = old_f.read(1024)
if len(con) == 0:
break
备份文件并写入数据,代码实现如下所示:
#1.用户输入目标文件
old_name = input('请输入您要备份的文件名:')
print(old_name)
print(type(old_name))
#2.规划备份文件的名字
#2.1 提取后缀 -- 找到名字中的点 -- 最右侧的点才是后缀的点 -- 字符串查找某个子串rfind
index = old_name.rfind('.')
#print(index)
#2.2 组织新名字 = 原名字+ [备份]+ 后缀
#原名字就是字符串中的一部分子串 -- 切片[开始:结束:步长]
print(old_name[:index])
print(old_name[index:])
new_name = old_name[:index]+ '[备份]'+ old_name[index:]
print(new_name)
#3.备份文件写入数据(数据和原文件一样)
#3.1 打开源文件 和 备份文件
old_f = open(old_name,'rb')
new_f = open(new_name,'wb')
#3.2 源文件读取,备份文件写入
#如果不确定目标文件大小,循环读取写入,当读取出来的数据没有了就终止循环
while True:
con = old_f.read(1024)
if len(con) == 0:
#表示读取完成了
break
new_f.write(con)
#3.3 关闭文件
old_f.close()
new_f.close()
运行结果:
258_文件备份之限制有效文件名备份
思考:如果用户输入.txt,这是一个无效文件,程序如何更改才能限制只有有效的文件名才能备份?
答:添加条件判断即可。
#1.用户输入目标文件
old_name = input('请输入您要备份的文件名:')
print(old_name)
print(type(old_name))
#2.规划备份文件的名字
#2.1 提取后缀 -- 找到名字中的点 -- 最右侧的点才是后缀的点 -- 字符串查找某个子串rfind
index = old_name.rfind('.')
#print(index)
#4.思考:有效文件才备份.txt
if index > 0:
#提取后缀
postfix = old_name[index:]
#2.2 组织新名字 = 原名字+ [备份]+ 后缀
#原名字就是字符串中的一部分子串 -- 切片[开始:结束:步长]
print(old_name[:index])
print(old_name[index:])
#new_name = old_name[:index]+ '[备份]'+ old_name[index:]
new_name = old_name[:index]+ '[备份]'+ postfix
print(new_name)
#3.备份文件写入数据(数据和原文件一样)
#3.1 打开源文件 和 备份文件
old_f = open(old_name,'rb')
new_f = open(new_name,'wb')
#3.2 源文件读取,备份文件写入
#如果不确定目标文件大小,循环读取写入,当读取出来的数据没有了就终止循环
while True:
con = old_f.read(1024)
if len(con) == 0:
#表示读取完成了
break
new_f.write(con)
#3.3 关闭文件
old_f.close()
new_f.close()
运行结果:
259_文件操作函数
四、文件和文件夹的操作
在python中,文件和文件夹的操作要借助os模块里面的相关功能,具体步骤如下:
1.导入os模块
import os
2.使用os模块相关功能
os.函数名
4.1 文件重命名
os.rename(目标文件名,新文件名)
4.2 删除文件
os.remove(目标文件名)
借助os模块里面的相关功能处理文件命名和删除操作,代码实现如下:
"""
1.导入模块os
2.使用模块内功能
"""
import os
#1.rename():重命名
# os.rename('1.txt','10.txt')
#2.remove():删除文件
os.remove('10.txt')
运行结果:
260_文件夹操作函数之创建和删除
4.3 创建文件夹
os.mkdir(文件夹名字)
创建文件夹,代码实现如下所示:
"""
1.导入模块os
2.使用模块内功能
"""
import os
#1.rename():重命名
# os.rename('1.txt','10.txt')
#2.remove():删除文件
#os.remove('10.txt')
#3.mkdir():创建文件夹
os.mkdir('aa')
运行结果:
4.4 删除文件夹
os.rmdir(文件夹名字)
删除文件夹,代码实现如下所示:
#4.rmdir():删除文件夹
os.rmdir('aa')
261_文件夹操作函数之路径相关函数
4.5 获取当前目录
os.getcwd()
利用getcwd()函数,返回文件所在路径,代码实现如下所示:
#5.getcwd():返回当前文件所在目录路径
print(os.getcwd())
运行结果:
4.6 改变默认目录
os.chdir(目录)
改变默认目录,并在指定目录里创建新的文件夹,代码实现如下所示:
#6.chdir():改变目录路径
#os.mkdir('aa')
#需求:在aa里面创建bb文件夹:1.切换目录到aa. 2.创建bb
#os.mkdir('bb')
os.chdir('aa')
os.mkdir('bb')
运行结果:
4.7 获取目录列表
os.listdir(目录)
获取当前所在Py文件夹下的所有文件,并返回一个列表,代码实现如下所示:
#7.listdir():获取某个文件夹下所有文件,返回一个列表
print(os.listdir())
print(os.listdir('aa'))
运行结果:
262_文件夹操作函数之rename
4.1 文件重命名
os.renmae(目标文件名,新文件名)
文件重命名,代码实现如下所示:
#8.rename() -- 重命名文件夹 bb重命名为bbbb
os.rename('bb','bbbb')
运行结果:
263_批量重命名之添加字符串
五、应用案例额
需求:批量修改文件名,既可添加指定字符串,又能删除指定字符串。
步骤:
1.设置添加删除字符串的标识
2.获取指定目录的所有文件
3.将原有文件名添加、删除指定字符串,构造新名字
4.os.rename()重命名
#需求1:把code文件夹下所有文件重命名为python xxxxx
import os
#1.找到所有文件:获取code文件夹的目录列表 -- Llistdir()
file_list = os.listdir()
print(file_list)
#2.构造名字
for i in file_list:
#new_list = 'CaiLirong_' + '源文件名'
#new_name = 'python_' + i
new_name = 'CaiLirong_' + i
#3.重命名
os.rename(i,new_name)
运行结果:
264_批量重命名之添加和删除字符串
需求:批量修改文件名,既可添加指定字符串,又能删除指定字符串。
#需求1:把code文件夹下所有文件重命名为python xxxxx
#需求2:删除CaiLirong_python_ 重命名:1.构造条件的数据 2.书写if
import os
#构造条件的数据
flag == 2
#1.找到所有文件:获取code文件夹的目录列表 -- Llistdir()
file_list = os.listdir()
print(file_list)
#2.构造名字
for i in file_list:
if flag == 1:
#new_list = 'CaiLirong_' + '源文件名'
#new_name = 'python_' + i
new_name = 'CaiLirong_' + i
elif flag == 2:
#删除前缀
num = len('CaiLirong_python_')
new_name = i[num:]
#3.重命名
os.rename(i,new_name)
运行结果:
265_文件总结
六、总结
- 文件操作步骤
- 打开
文件对象 = open(目标文件,访问模式)
- 操作
读
文件对象.read()
文件对象.readlines()
文件对象.readline()
写
文件对象.write
- seek()
- 关闭
文件对象.close()
- 主访问模式
1.w:写,文件不存在则新建该文件
2.r:读,文件不存在则报错
3.a:追加 - 文件和文件夹操作
1.重命名:os.rename()
2.获取当前目录:os.getcwd()
3.获取目录列表:os.listdir()