麻烦老师看一下代码

麻烦老师看一下代码

麻烦老师评论一下

还有文件备份为什么不使用shutil.copyfile()文件拷贝而是使用文件写入的方式

运行

http://img1.sycdn.imooc.com//climg/5ea3ad5808428a3b13081016.jpg

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)


正在回答

登陆购买课程后可参与讨论,去登陆

3回答

同学,你好。老师这边测试代码是无法运行的,如图:

http://img1.sycdn.imooc.com//climg/5ea525a30974aa6207280390.jpg

第一句成立,则第二句永远不会成立,且每当第一句成立,第三句肯定会执行,这就导致了backup函数每循环一次就会调用一次,因此报目录结构太深的错误;

skipFile类属性里定义了,但是skipFile却没有放入数值,在没有值的情况下判断if path_src_dir in self.skipFile此句,是永远不会成立的,因此不可行。建议同学看完老师的视频根据老师的视频敲一遍代码,如果想要扩充功能,可以具体提问,会安排老师为你解答的。

祝学习愉快~

  • qq_浮沉_34 提问者 #1
    老师, path_src_dir path_dist_Dir 这两个变量分别代表的是需要备份文件的路径和备份到的路径
    2020-04-26 14:19:32
  • qq_浮沉_34 提问者 #2
    老师,能不能加一下其他的社交软件,这样问没法发图片,也看的不及时 第1句if是在需要备份的源文件判断文件夹还是文件 第2句是 将源文件备份到的路径,就比如,第1 句当判断为文件夹,执行第2个判断,判断在备份目录下这个文件夹是否存在,不存在就创建一个新的文件夹 接下来在执行第3句 这样写没问题啊
    2020-04-26 14:24:47
  • qq_浮沉_34 提问者 #3
    skipFile这个是我提问之前清空的,之前是有内容的,不过这个不影响吧 老师,我这运行没问题的啊, src ='需要备份的文件' dist = "备份到的路径" FileBackup(src, dist)
    2020-04-26 14:29:01
好帮手慕笑蓉 2020-04-26 11:54:38

同学,你好。是可以使用shutil.copyfile()进行文件拷贝的,但实际项目中往往需要写一些符合程序要求的拷贝方法,比如哪些文件可以拷贝,哪些不能,所以还是需要对程序的拷贝过程有一些了解。

根据同学提供的代码有以下几点需要注意:

  1. return不要返回print()语句的数据,因为print()的没有值,只是将数据输出了,所以不要用return去返回print()数据:

    http://img1.sycdn.imooc.com//climg/5ea5021c0916cf1305970252.jpg

  2. self.backup(path_src_dir, path_dist_Dir)代码反复执行,最终导致目录结构过深而报错:

    http://img1.sycdn.imooc.com//climg/5ea5044809631c6d07030388.jpg

  3. 在使用self.skipFile代码时,skipFile里面还没有加入值

    http://img1.sycdn.imooc.com//climg/5ea5048b09997c8105040105.jpg

建议同学跟着老师的代码来,一步一步实现。

如果解决了你的疑惑,请采纳,祝学习愉快~ 

  • 提问者 qq_浮沉_34 #1
    老师, 1.那个print()是临时后加上去的,就是为了效果, 2.第一层的 if os.path.isdir(path_src_dir):是判断(源路径)当前的路径是不是文件夹, 第二个是判断备份目录是不是存在这个文件夹,如果不存在就进行创建,然后在拷贝文件 3.在类属性里面就有啊,只是我里面没有放入值 skipFile = [''] # 忽略文件 [路径/文件名] skipPath = [] # 忽略文件夹 [路径] 老师,您说的问题2,代码反复执行,可我感觉很精简了,不知道再怎么优化了,希望老师给下修改建议
    2020-04-26 12:10:47
提问者 qq_浮沉_34 2020-04-25 11:25:01

打错了,麻烦老师评价一下,哪里不足

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师