麻烦老师看一下代码

麻烦老师看一下代码

麻烦老师评论一下

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

运行

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

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 = [00]
 
    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:
        """
        = 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下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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