麻烦老师看一下代码
麻烦老师评论一下
还有文件备份为什么不使用shutil.copyfile()文件拷贝而是使用文件写入的方式
运行
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积分~
来为老师/同学的回答评分吧
0 星