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)

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

『无为则无心』Python基础 — 43、文件备份的实现的更多相关文章

  1. 『无为则无心』Python基础 — 8、Python中的数据类型(数值、布尔、字符串)

    目录 1.数据类型介绍 2.数值型(Number) 3.布尔型(bool) 4.None(空值) 5.常量 6.字符串(String) 1.数据类型介绍 (1)什么是数据类型 在生活中,我们日常使用的 ...

  2. 『无为则无心』Python基础 — 14、Python流程控制语句(while循环语句)

    目录 1.什么是循环结构 2.while循环 (1)while循环的语法 (2)while循环的应用 3.while语句的死循环 4.break和continue 5.while循环嵌套 (1)应用场 ...

  3. 『无为则无心』Python基础 — 16、Python序列之字符串的下标和切片

    目录 1.序列的概念 2.字符串的下标说明 3.字符串的切片说明 1.序列的概念 序列sequence是Python中最基本的数据结构.指的是一块可存放多个值的连续内存空间,这些值按一定顺序排列,可通 ...

  4. 『无为则无心』Python基础 — 41、Python中文件的读写操作(一)

    目录 1.文件操作步骤 2.文件的读写操作 (1)文件的打开 (2)打开文件模式 (3)获取一个文件对象 (4)关于文件路径 1.文件操作步骤 当我们要读取或者写入文件时,我们需要打开文件,在操作完毕 ...

  5. 『无为则无心』Python基础 — 63、Python中的生成器

    目录 1.为什么要有生成器 2.创建生成器 (1)简单创建生成器 (2)生成器的使用 3.yield关键词 (1)yield关键词说明 (2)send()方法说明 4.使用yield实现斐波那契数列 ...

  6. 『无为则无心』Python基础 — 2、编译型语言和解释型语言的区别

    目录 1.什么是计算机语言 2.高级语言中的编译型语言和解释型语言 (1)编译型语言 (2)解释型语言 (3)编译型语言和解释型语言执行流程 3.知识扩展: 4.关于Python 1.什么是计算机语言 ...

  7. 『无为则无心』Python基础 — 3、搭建Python开发环境

    目录 1.Python开发环境介绍 2.Python解释器的分类 3.下载Python解释器 4.安装Python解释器 5.Python解释器验证 1.Python开发环境介绍 所谓"工欲 ...

  8. 『无为则无心』Python基础 — 4、Python代码常用调试工具

    目录 1.Python的交互模式 2.IDLE工具使用说明 3.Sublime3工具的安装与配置 (1)Sublime3的安装 (2)Sublime3的配置 4.使用Sublime编写并调试Pytho ...

  9. 『无为则无心』Python基础 — 5、Python开发工具的安装与使用

    目录 1.Pycharm下载 2.Pycharm安装 3.PyCharm界面介绍 4.基本使用 (1)新建Python项目 (2)编写Python代码 (3)执行代码查看结果 (4)设置PyCharm ...

随机推荐

  1. 【LeetCode】1025. Divisor Game 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 找规律 动态规划 日期 题目地址:https://l ...

  2. 【LeetCode】682. Baseball Game 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 使用栈模拟 日期 题目地址:https://leet ...

  3. Joseph(hdu1443)

    Joseph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  4. Arm64架构下静态编译Nginx

    这段时间,我一直忙于将 Rainbond 源码构建模块移植到 Arm64/aarch64 架构中.这一源码构建模块可以将指定代码仓库中包含的源码,拉取构建成为容器镜像,在各种容器平台中运行.目前支持的 ...

  5. Java 泛型通配符 T,E,K,V,?

    Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的数据类型被 ...

  6. C++输出控制小数点后位数的方法

    以C++输出小数点两位数为例 setprecision(n)使用方法总结 首先要记住写头文件 #include <iomanip> //不要忘了头文件 以下是控制小数位数的三种写法 //t ...

  7. 2. node接口搭建--连接MongoDB数据库 (参考https://blog.csdn.net/ncepu_Chen/article/details/98725104#_337)

    1.使用mongoose连接MongoDB数据库 npm install mongoose 2.新建文件夹config存放数据库地址 3.安装MongoDB

  8. CS5265 demoboard|CS5265测试板电路参考|CS5265 Typec转HDMI 4K60HZ方案

    CS5265是TYPEC转HDMI2.0音视频转换芯片,CS5265符合DP1.4协议,且输出的视频信号是HDMI2.0 即4K60HZ  CS5265集成了DP1.4兼容接收机和HDMI2.0b兼容 ...

  9. 基于Java swing+mysql+eclipse的【图书管理系统】

    本项目为Java swing项目,在工作环境中基本使用不到,但是很多学校把这个当做编程入门的项目来做,故分享出本项目供初学者参考. CSDN赞助下载:https://download.csdn.net ...

  10. Java高级程序设计笔记 • 【第6章 设计模式】

    全部章节   >>>> 本章目录 6.1 设计模式 6.1.1 设计模式概述和分类 6.1.2 单列模式介绍 6.1.3 单例模式的实现 6.1.4 实践练习 6.2 单例模式 ...