开发者学堂课程【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
结果:
以上代码是复制文件的大体框架,可以看出代码仍然有很多问题。
2.复制文件的不存在的问题
当你输入一个文件名,文件它不存在系统就会崩。需要在代码中添加一个判断,判断文件是否存在,下面按要求修改:
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)方法一
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('
您输入的文件不存在')