1、需求
用户输入当前目录下任意文件名,程序完成对该文件的备份功能。
备份文件名为xx[备份]后缀
,例如:test[备份].txt
。
2、步骤
接收用户输入的文件名。规划备份文件名。备份文件写入数据。
3、代码实现
(1)接收用户输入目标文件名
old_name = input('请输入您要备份的文件名:')
(2)规划备份文件名
2.1 提取目标文件后缀。
2.2 组织备份的文件名,xx[备份]后缀。
# 2.1 提取文件后缀点的下标 index = old_name.rfind('.') # 2.2 组织新文件名 旧文件名 + [备份] + 后缀 new_name = old_name[:index] + '[备份]' + old_name[index:]
(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 # 新文件写入读取的数据 new_f.write(con) # 3.3 关闭文件 old_f.close() new_f.close()
(4)思考
如果用户输入.txt
,这是一个无效文件,程序如何更改才能限制只有有效的文件名才能备份?
答:添加条件判断即可。
# 有文件名,才能提取后缀 # 这里无法取得后缀,拼接的时候没有后缀的变量 # 就会报错 if index > 0: postfix = old_name[index:]
(5)完整编码
1)传统实现
# 1. 用户输入目标文件 如:sound.txt.mp3 old_name = input('请输入您要备份的文件名:') # 2. 规划备份文件的名字 # 2.1 提取后缀 -- # 找到名字中的最右侧的点才是后缀的点 # 在右侧查找rfind()方法 # 获取文件全名中后缀.的位置 index = old_name.rfind('.') # 4. 思考:有效文件才备份 .txt if index > 0: # 提取后缀,这里提取不到,后面拼接新文件名字的时候就会报错 postfix = old_name[index:] # 2.2 组织新名字 = 原名字 + [备份] + 后缀 # 原名字就是字符串中的一部分子串 -- 切片[开始:结束:步长] # new_name = old_name[:index] + '[备份]' + old_name[index:] new_name = old_name[:index] + '[备份]' + postfix # 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()
2)实际工作实现
# 1. 用户输入目标文件 如:sound.txt.mp3 old_name = input('请输入您要备份的文件名:') # 获取文件全名中后缀.的位置 index = old_name.rfind('.') # 4.有效文件才备份 .txt if index > 0: postfix = old_name[index:] # 3.开始备份文件 # 打开原文件 with open(old_name , 'rb') as file_obj: # 组织新名字 = 原名字 + [备份] + 后缀 new_name = old_name[:index] + '[备份]' + postfix # 创建并打开新文件 with open(new_name, 'wb') as new_obj: # 定义每次读取的大小 chunk = 1024 * 100 while True: # 从已有的对象中读取数据 content = file_obj.read(chunk) # 内容读取完毕,终止循环 if not content: break # 将读取到的数据写入到新对象中 new_obj.write(content)
两种方式实现的功能一样。
4、再来一个小练习
需求:二进制文件读取(实现方式和上边一样)
# 读取模式 # t 读取文本文件(默认值) # b 读取二进制文件 file_name = “hello.txt” with open(file_name , 'rb') as file_obj: # 读取文本文件时,size是以字符为单位的 # 读取二进制文件时,size是以字节为单位 # print(file_obj.read(100)) # 将读取到的内容写出来 # 定义一个新的文件 new_name = 'aa.txt' with open(new_name , 'wb') as new_obj: # 定义每次读取的大小 chunk = 1024 * 100 while True : # 从已有的对象中读取数据 content = file_obj.read(chunk) # 内容读取完毕,终止循环 if not content : break # 将读取到的数据写入到新对象中 new_obj.write(content)
注意:纯文本文件也可以使用二进制方法进行读取操作。