1、需求

用户输入当前目录下任意文件名,程序完成对该文件的备份功能。

备份文件名为xx[备份]后缀,例如:test[备份].txt

2、步骤

  1. 接收用户输入的文件名。
  2. 规划备份文件名。
  3. 备份文件写入数据。

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)

注意:纯文本文件也可以使用二进制方法进行读取操作。

最新文章

  1. nuget包管理器控制台下的powershell脚本介绍
  2. 四、优化及调试--网站优化--Yahoo军规上
  3. Jsch
  4. Trigger Execution Sequence in Oracle Forms
  5. Php开发完全跨站点跨域名单点(SSO)同步登录和注销
  6. 先从_proto_下手理解原型--原型学习(一)
  7. Google2016 面试题 吹气球 区间dp
  8. Scala编程快速入门系列(一)
  9. WordPress安装官方文档教程
  10. 【原】Java学习笔记023 - 字符串缓冲区_正则表达式
  11. Codeforces300 F. A Heap of Heaps
  12. 论文笔记:Dynamic Multimodal Instance Segmentation Guided by Natural Language Queries
  13. eclipse删除多余的工作空间
  14. linux服务器安装brook服务端 使用brook客户端
  15. impdp导入表不创建segments
  16. 为Subline Text 3 添加支持ini文件语法高亮
  17. aaronyang的百度地图API之LBS云 笔记[开发准备]
  18. AI、机器学习、深度学习、神经网络
  19. pygame绘制文本
  20. 23TCP通信

热门文章

  1. B. Recover the String
  2. fastapi(一)
  3. Feign动态调用,结合Ribbon
  4. zbar解析二维码demo
  5. Android物联网应用程序开发(智慧园区)—— 登录界面开发
  6. SpringBoot文章合集
  7. JZOJ5409. Fantasy && Luogu2048 [NOI2010]超级钢琴
  8. Pytest_钩子方法setup、teardown、setup_class、teardown_class(8)
  9. spring clould -多模块 -swagger2 配置 nginx 的正确设置
  10. Linux命令--ss命令的参数及使用详解