文件拷贝功能 | 学习笔记

简介: 快速学习 文件拷贝功能

开发者学堂课程【Python入门 2020年版文件拷贝功能】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/639/detail/10401


文件拷贝功能


内容介绍:

一、复制文件操作代码思路

二、仅能复制文本文件问题


一、复制文件操作代码思路

1.复制文件代码大体框架

文件拷贝:你输入一个文件的路径,有这么一个文件 file_name = input('请输入一个文件路径:'),系统会将文件复制一份。

比方你提供 sss.txt 文件,系统给你复制成 sss.bak.txt 文件# sss.txt ==> sss.bak.txt

文件复制:就是把文件的东西读出来再写到另一个文件里。

1)打开旧文件

old_file = open(file_name , encoding=" utf8 ')

#老文件以 open(file_name , encoding=" utf8 ')方式打开

new_file_name = 'test.txt'

#将新文件命名为“test.txt

new_file = open(new_file_name 'w' ,encoding='utf8')

#打开一个新文件用于写入

2)把旧文件的数据读取出来写入到新的文件

new_file.write(old_file.read( ))

#写出从旧文件中读取的内容

new_file.close()

old_file.close()

3)运行代码

请输入一个文件路径:sss.txt

结果:

image.png

以上代码是复制文件的大体框架,可以看出代码仍然有很多问题。

2.复制文件的不存在的问题

当你输入一个文件名,文件它不存在系统就会崩。需要在代码中添加一个判断,判断文件是否存在,下面按要求修改:

import os

file_name = input('请输入一个文件路径: ')

# sss.txt ==> sss.bak.txt

if os.path.isfile(file_name ) :

#判断是否是文件

#打开旧文件

old_file = open(file_name , encoding=" utf8 ')

new_file_name = 'test.txt'

new_file = open(new_file_name 'w' ,encoding='utf8')

# 打开一个新文件用于写入

new_file.write(old_file.read( ))

#把旧文件的数据读取出来写入到新的文件

new_file.close()

old_file.close()

else:

print('您输入的文件不存在')

若判断文件不存在,会直接打印“您输入的文件不存在”,若判断文件存在,则会复制一份文件。

3.复制文件名重复的问题

每一次复制的文件名都是test.txt,并且覆盖了之前复制的文件。下面按要求修改(不同的文件要设置不同的备份):

1)方法一

import os

file_name = input('请输入一个文件路径: ')

# sss.txt ==> sss.bak.txt

if os.path.isfile(file_name ) :

#判断是否是存在的文件

#打开旧文件

old_file = open(file_name , encoding=" utf8 ')

# 需要系统根据你每次的文件名字对应的生成另一个名字,复制文件的原理为 sss.txt ==> sss.bak .txt

# 生成的文件规律:'sss' + 'bak ' + 'txt'

names = file_name.rpartition( ' . ')

#将原有的文件名分成( 'sss ' , ' . ' , 'txt ' )

new_fiLe_name = names[0]+ '.bak .' + names[2]

#新的名字命名方式是提取原有文件分割后的第0个(表示前面的名字),第2个(后缀名)数据,中间用“.bak.”分隔。

new_file_name = 'test.txt'

new_file = open(new_file_name 'w' ,encoding='utf8')

# 打开一个新文件用于写入

#把旧文件的数据读取出来写入到新的文件

new_file.write(old_file.read( ))

new_file.close()

old_file.close()

else:

print('您输入的文件不存在')

2)方法二

import os

file_name = input('请输入一个文件路径: ')

# sss.txt ==> sss.bak.txt

if os.path.isfile(file_name ) :

#判断是否是文件

old_file = open(file_name , encoding=" utf8 ')

#打开旧文件

names = os.path.splitext(file_name)

#将原有的文件名分成( 'sss ' , ' . txt ' ),前面是“sss”文件名,后面是点加后缀名

print( names)

new_fiLe_name = names[0] + '.bak ' + names[1]

#复制文件的原理为 sss.txt ==> sss.bak .txt,新的名字命名方式是提取原有文件分割后的第0个(表示前面的名字),第1个(后缀名)数据,中间用“.bak”分隔。

names = os.path.spitext(file_name)

new_file = open(new_file_name 'w' ,encoding='utf8')

# 打开一个新文件用于写入

new_file.write(old_file.read( ))

#把旧文件的数据读取出来写入到新的文件

new_file.close()

old_file.close()

else:

print('您输入的文件不存在')

从文件名的最后一个点切开,例如文件名为

2020.2.27.11.32.error.txt,文件名切成

2020.2.27.11.32.error”和“.txt( 2020.2.27.11.32.erro' , '.txt ')

Bak 表示备份,文件名加上bak表示这是一份备份文件,对原来的文件进行了拷贝、复制。


二、文件拷贝的优化

1.能复制文本文件的问题

复制图片文件时会发生错误,虽然可以复制该文件,但是复制后的文件的格式是不对的。

图片文件是二进制,它不是一个文本,图片文件不是文本不会被读。故复制文件时要以二进制的读法读取将要被复制的文件,不能说做一个代码判断(若是二进制文件就以二进制来读,若是文本文件就以文本形式来读),因为文件的后缀名与文件格式是没有相关性的,文本可以以二进制的形式来读,所以可以直接用二进制读所有的文件,下面按要求修改(以二进制的读法读取将要被复制的文件,并且用二进制写):

file_name = input('请输入一个文件路径:')

if os.path.isfile(file_name) :

old_file = open(file_name'rb')

#以二进制的形式读取文件,读取的文件也是以二进制的形式呈现,不需要将二进制翻译成文本,可以直接用二进制写入新文件。

names = os.path.splitext(file_name)

new_file_name = names[0] + '.bak' + names[1]

new_file = open(new_file_name"wb')

#以二进制的形式写入文件

将原文件中的每一个文字以二进制的形式读取存入,再以二进制的形式写入,若需要查看复制的二进制文件时,可以用 utf-8转换成文本形式。

2.复制大文件时加载慢的问题

如果复制的文件比较大,读取的时候会全部被读出,加载会比较的慢,所以加入下面的死循环,每次都不会全部读完,只读1024个字节读完就会写入,再重复读取。

while True:

content = old_file.read(1024)

#读取出来的内容是二进制,每次就读文件的1024个字节,读完立马开始写入,再读文件的下一个1024个字节,继续写入重复以上操作。

new_file.write(content)

if not content:

break

new_file.close()

old file.close()

else:

print('您输入的文件不存在')

相关文章
|
分布式计算 DataWorks 关系型数据库
DataWorks产品使用合集之当需要将数据从ODPS同步到RDS,且ODPS表是二级分区表时,如何同步所有二级分区的数据
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
284 7
|
SQL 关系型数据库 分布式数据库
PolarDB产品使用问题之相同的SQL语句在不同时间执行EXPLAIN计划显示出不同的索引类型,是什么原因
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
PolarDB产品使用问题之相同的SQL语句在不同时间执行EXPLAIN计划显示出不同的索引类型,是什么原因
|
存储 安全 Linux
【专栏】RHCSA认证考试(EX200)聚焦Linux用户和组管理,涉及基本概念、命令及管理策略。
【4月更文挑战第28天】RHCSA认证考试(EX200)聚焦Linux用户和组管理,涉及基本概念、命令及管理策略。理解用户与组、根用户与普通用户、标准组与附加组的区别至关重要。关键文件包括`/etc/passwd`、`/etc/group`、`/etc/shadow`和`/etc/gshadow`。熟悉`useradd`、`passwd`、`groupadd`等命令以及权限管理工具如`chown`和`chmod`。遵循最小特权原则,定期审计账户,实施密码策略,并利用自动化工具提升效率。掌握这些知识将助力考生在RHCSA考试中表现出色,并在实际工作中有效管理Linux系统。
227 2
|
前端开发 算法 JavaScript
2024前端学习计划-程序员库里
前端学习计划 关键词:🔥🔥🔥 前端面试、前端算法、前端项目实战,独有前端面试题详解,前端面试刷题必备,1000+前端面试真题,Html、Css、JavaScript、Vue、React、Node、TypeScript、Webpack、算法、网络与安全、浏览器、低代码、前端脚手架
259 0
2024前端学习计划-程序员库里
|
人工智能 运维 Prometheus
博睿数据与阿里云签订云原生核心合作伙伴计划,推动企业智能运维落地
5 月 13 日,博睿数据与阿里云宣布达成深度合作,重点发力企业智能运维领域。双方签订了云原生核心合作伙伴计划,通过博睿数据领先的拨测网络结合阿里云独特的 AIOps 能力,构建全球领先的 SaaS 产品云拨测,为企业提供领先、专业、全面的智能运维能力。
博睿数据与阿里云签订云原生核心合作伙伴计划,推动企业智能运维落地
|
jenkins Java 持续交付
使用 Jenkins 创建微服务应用的持续集成
本场景指导您结合Jenkins把微服务应用部署到SAE平台
使用 Jenkins 创建微服务应用的持续集成
|
4天前
|
数据采集 人工智能 安全