麻烦老师看一下代码
麻烦老师评论一下
还有文件备份为什么不使用shutil.copyfile()文件拷贝而是使用文件写入的方式
运行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | import os import hashlib import shutil import time class FileBackup( object ): skipFile = [''] # 忽略文件 [路径/文件名] skipPath = [] # 忽略文件夹 [路径] updateNum = [ 0 , 0 ] def __init__( self , src, dist): self .src = src.strip().rstrip( '/' ) self .dist = dist.strip().rstrip( '/' ) if not os.path.isdir( self .src): return print ( '> error:源文件夹不存在' ) if not os.path.isdir( self .dist): if not self .mkdir( self .dist): return print ( '> 备份文件夹创建失败' ) else : print ( '> 备份文件夹初始化成功' ) self .backup( self .src, self .dist) print ( '共更新: \n\t> 文件:{}\n\t> 文件夹:{}' . format ( self .updateNum[ 0 ], self .updateNum[ 1 ])) def backup( self , src, dist): for item in os.listdir(src): path_src_dir = src + '/' + item path_dist_Dir = dist + '/' + item if os.path.isdir(path_src_dir): # 文件夹 if path_src_dir in self .skipPath: continue if not os.path.isdir(path_dist_Dir): self .mkdir(path_dist_Dir) self .backup(path_src_dir, path_dist_Dir) else : # 文件 if path_src_dir in self .skipFile: continue # 文件对比 if os.path.isfile(path_dist_Dir): # 文件存在 srcMd5 = self .md5_file(path_src_dir) distMd5 = self .md5_file(path_dist_Dir) # 文件MD5对比 if not srcMd5 = = distMd5: self .backup_file(path_src_dir, path_dist_Dir) else : # 拷贝 self .backup_file(path_src_dir, path_dist_Dir) def backup_file( self , src, dist): """ 文件拷贝 :param src: 源文件 :param dist: 备份 :return: """ try : shutil.copyfile(src, dist) print ( '\t拷贝成功 ' + dist) self .updateNum[ 0 ] + = 1 except : print ( '\t拷贝失败 ' + dist) def md5_file( self , path): """ 分段计算文件MD5 :param path: :return: """ m = hashlib.md5() with open (path, 'rb' ) as fo: while True : data = fo.read( 1024 ) # 避免内存泄漏,分段读取 if not data: break m.update(data) # 更新MD5 return m.hexdigest() def mkdir( self , path, name = None ): """ 文件夹创建 :param path: 路径 [路径/文件夹] :param name: 文件夹名 [None] :return: bool """ if name ! = None : path = path + "/" + name path = path.strip().rstrip( '/' ) os.mkdir(path) if os.path.isdir(path): self .updateNum[ 1 ] + = 1 print ( '> 文件夹创建成功 ' + path) return True else : return False if __name__ = = '__main__' : # 目标路径 src = '/Applications/XAMPP/xamppfiles/htdocs/pro/app_manage_2/application/' # 备份路径 dist = "/Users/apple/Desktop/back/" FileBackup(src, dist) |
正在回答
同学,你好。老师这边测试代码是无法运行的,如图:
第一句成立,则第二句永远不会成立,且每当第一句成立,第三句肯定会执行,这就导致了backup函数每循环一次就会调用一次,因此报目录结构太深的错误;
skipFile类属性里定义了,但是skipFile却没有放入数值,在没有值的情况下判断if path_src_dir in self.skipFile此句,是永远不会成立的,因此不可行。建议同学看完老师的视频根据老师的视频敲一遍代码,如果想要扩充功能,可以具体提问,会安排老师为你解答的。
祝学习愉快~
同学,你好。是可以使用shutil.copyfile()进行文件拷贝的,但实际项目中往往需要写一些符合程序要求的拷贝方法,比如哪些文件可以拷贝,哪些不能,所以还是需要对程序的拷贝过程有一些了解。
根据同学提供的代码有以下几点需要注意:
return不要返回print()语句的数据,因为print()的没有值,只是将数据输出了,所以不要用return去返回print()数据:
self.backup(path_src_dir, path_dist_Dir)代码反复执行,最终导致目录结构过深而报错:
在使用self.skipFile代码时,skipFile里面还没有加入值
建议同学跟着老师的代码来,一步一步实现。
如果解决了你的疑惑,请采纳,祝学习愉快~
- 参与学习 人
- 提交作业 2727 份
- 解答问题 8160 个
想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧