zoukankan      html  css  js  c++  java
  • python入门-简单的文件备份程序

    由于备份的需要,需要经常备份一些重要的文件,但是又不能逐个比较,所以就度了一下,找到了这篇博文,在此表示感谢,下面是python3版的写法,其中有一些改变,重要的改变之处作出了简要注释,完整注释请参考原文,

    重要:下面代码未经充分测试,在备份自己文件之前,请充分测试,如有疏漏之处,欢迎留言,一起学习

    注意:注意路径的分割斜杠,在这里是斜杠/而非反斜杠

    md5校验选择备份

     1 # -*- coding: utf-8 -*-
     2 
     3 
     4 import hashlib
     5 import os
     6 import shutil
     7 
     8 
     9 def md5check(fname):
    10     m = hashlib.md5()
    11     with open(fname, 'rb') as f: # 这里文件的打开方式与原文不同,由于在备份我的文件时出现了编码问题,所以进行了修改,以二进制方式打开
    12         while True:
    13             data = f.read(4096)
    14             if not data:
    15                 break
    16             m.update(data)
    17     return m.hexdigest()
    18 
    19 
    20 
    21 
    22 # 文件复制函数
    23 def copy(path):
    24     new_path = path
    25     new_path = new_path.replace(old_source, new_source)
    26     print(new_path)
    27     if os.path.isfile(new_path):
    28         old_md5 = md5check(path)
    29         new_md5 = md5check(new_path)
    30         if old_md5 != new_md5:
    31             shutil.copy(path, new_path)
    32     else:
    33         dirname = os.path.dirname(new_path)
    34         if os.path.exists(dirname): # 如果目录存在,直接复制文件到new_path
    35             shutil.copy(path, new_path)
    36         else: # 如果目录不存在,则直接创建目录并复制文件
    37             try:
    38                 os.makedirs(dirname)
    39                 shutil.copy(path, new_path)
    40             except WindowsError:
    41                 print('创建目录出错')
    42 
    43 # 查找所有目录文件的递归函数
    44 def lsdir(folders):
    45     path = os.listdir(folders)
    46     for line in path:
    47         line = folders + '/' + line
    48         if(os.path.isdir(line)):
    49             lsdir(line)
    50         else:
    51             copy(line)
    52 
    53 
    54 55 56 
    57 
    58 
    59 if __name__ == '__main__':
    60     global old_source
    61     global new_source
    62     print('例子:d:/directory,请输入要备份的目录所在地址、以及目标地址:')
    63     old_source = 'C:/Users/xxxx/AppData/Local/Google/Chrome/User Data/Default/Local Storage/leveldb'
    64     new_source = 'D:/leveldb' # 此处不知道只传入盘符会发生什么,建议不要这么做,未经测试
    65     lsdir(old_source)
    66     

    完全备份

    # -*- coding: utf-8 -*-
    # 脚本功能:删除new_path目录,然后复制original_path到new_path目录,注意两目录的名称要一样,初衷:用于名称变化的需要备份的文件
    # 基于python3
    
    import os
    import shutil
    
    # 不校验直接删除已备份文件,再重新备份源文件
    def non_checkout_backup(original_path, new_path):
        if os.path.exists(new_path):
            shutil.rmtree(new_path) # shutil.rmtree空目录、有内容的目录都可以删,但是必须要存在,否则报错, 而os.rmdir只能删除空目录
        shutil.copytree(original_path, new_path) # original_path、new_path都只能是目录
    
    
    
    if __name__ == '__main__':
        original_path = 'C:/Users/xxxx/AppData/Local/Google/Chrome/User Data/Default/Local Storage/leveldb'
        new_path = 'D:/leveldb'
        non_checkout_backup(original_path, new_path)
  • 相关阅读:
    e621. Activating a Keystroke When Any Child Component Has Focus
    e587. Filling Basic Shapes
    e591. Drawing Simple Text
    e595. Drawing an Image
    e586. Drawing Simple Shapes
    e636. Listening to All Key Events Before Delivery to Focused Component
    在 PL/SQL 块的哪部分可以对初始变量赋予新值? (选择1项)
    Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项)
    你判断下面语句,有什么作用?(单选)
    Oracle数据库表空间与数据文件的关系描述正确的是( )
  • 原文地址:https://www.cnblogs.com/xia-Autumn/p/8295327.html
Copyright © 2011-2022 走看看