今天分享一个很有用的小代码~
就是关于文件的备份
import os #导入os模块
ori_file_name = r'E:\PYTHON\mayday.mp3' #输入文件路径
if os.path.isfile(ori_file_name): #判断该路径的是否是文件
#截取文件名,重组文件名
seek_num = ori_file_name.rfind('.')
new_file_name =ori_file_name[:seek_num]+'_copy'+ori_file_name[seek_num:]
#打开源文件
old_file = open(ori_file_name,'rb')
#读取文件信息
old_file_content = old_file.read()
#创建新文件
new_file = open(new_file_name,'wb')
#将原始文件信息写入
new_file.write(old_file_content)
#关闭文件
old_file.close()
new_file.close()
else:
print('没有该文件')
好,这个代码就满足一般文件的copy了,
但是,如果遇到大文件,在读取文件信息的时候内存扛不住得话应该怎么办
emmmmm.....那肯定再买一条64G的内存啊!!!!
开个玩笑。我们下面对代码进行改良,可达到省下一个内存条的钱的效果
import os # 导入os模块
ori_file_name = r'D:\大文件.rmvb' # 输入文件路径
if os.path.isfile(ori_file_name): # 判断该路径的是否是文件
# 截取文件名,重组文件名
seek_num = ori_file_name.rfind('.')
new_file_name = ori_file_name[:seek_num] + '_copy' + ori_file_name[seek_num:]
# 打开源文件
old_file = open(ori_file_name, 'rb')
# 创建新文件
new_file = open(new_file_name, 'ab')
# 读取文件信息,这部会在后面解释
# for i in old_file:
# if not i:
# break
new_file.write(i)
new_file.write(old_file.read())
# 关闭文件
old_file.close()
new_file.close()
else:
print('没有该文件')
关于那个for循环,
最早的时候,我想的是用 for i in old_file.readlines(),后来发现,依然崩溃了,因为在使用readlines读取文件时,系统会吧该文件整个文件转换成一个列表,而这个列表会占用内存,所以虽然能剩去写入时的内存,但是依然会浪费大部分资源。
后来我试试了如下代码: print(isinstance(old_file,Iterable)) ==>True 即old_file是可以迭代的,那么,old_file的对象是源文件,且这里没有对他在进行分解,所以在迭代old_file的时候不会占用空间,所以这样就只会在写入时候占用内存了以达到拷贝的效果。
以上是本人的见解,不知道是否有不对的地方,还希望有看到的大神帮忙指出~~