python 文件操作--编写程序,进行文件夹增量备份

 代码来自网络,我进行了一些注释与修改

要个点赞关注没问题吧

程序功能与用法:
指定源文件夹与目标文件夹,自动检测自上次备份以来源文件夹中内容的改变,
包括修改的文件、新建的文件、新建的文件夹等等,自动复制新增或修改过的文件到目标文件夹中,
自上次备份以来没有修改过的文件将被忽略而不复制,从而实现增量备份。

import os
import filecmp
import shutil
import sys


def usage():
    print("scrDir and dstDir must be existing absolute path of certain directory")
    print("For example:{0} c:\\olddir c:\\newdir".format(sys.argv[0]))
    # sys.argv  返回当前工作文件路径
    sys.exit(0) #正常退出

def autoBackup(scrDir, dstDir):
    if ((not os.path.isdir(scrDir)) or (not os.path.isdir(dstDir))  or\
        (os.path.abspath(scrDir) != scrDir) or (os.path.abspath(dstDir) != dstDir)):
        #如果所给两个路径是否为文件夹,并且所给路径和绝对路径相同
        #os.path.isdir(path) 判断path是否为文件夹
        #os.path.abspath(path) 返回path的绝对路径
        usage() #那就输出错误提示
        
    for item in os.listdir(scrDir): #开始对源文件夹进行遍历
        #os.path.listdir(path)  返回path目录下的文件和目录列表
        scrItem = os.path.join(scrDir, item) #scrtem为scrDir的下一级目录
        #os.path.join(path, *path) 连接两个或多个path
        dstItem = scrItem.replace(scrDir, dstDir) # dstTItem为备份文件夹下与scrItem相同的目录

        if os.path.isdir(scrItem): #如果srcItem是文件夹
            if not os.path.exists(dstItem): #如果备份文件夹里没有这个文件夹
                # os.path.exists(path) 判断文件是否存在
                os.makedirs(dstItem) #那就在备份文件夹里创建它
                #os.makedirs(path)递归创建文件夹目录path
                print("make directory" + dstItem) #输出说创建了一个文件夹目录
            autoBackup(scrItem, dstItem) #因为所创建备份文件夹目录为空,所以需要递归返回函数继续遍历源文件夹,继续备份

        elif os.path.isfile(scrItem): #如果scrItem是文件
            # os.path.isfile(path) 判断path是否为文件
            if ((not os.path.exists(dstItem)) or\
                (not filecmp.cmp(scrItem, dstItem, shallow=True))):
                #如果备份文件夹里没有这个文件,或这个文件与上次备份相比被修改过
                #filecmp.cmp(f1,f2,[shallow]) 比较f1和f2文件内容是否相等,可选参数shallow定义是否考虑文件本身的属性
                shutil.copyfile(scrItem, dstItem) #备份文件
                #shutil.copyfile(f1,f2) 将f1的文件拷贝到f2
                print("file:" + scrItem + "==>" + dstItem) #输出文件备份的提示

# if __name__ == "__main__":
#     if (len(sys.argv) != 3):
#         usage()
#     scrDir, dstDir = sys.argv[1], sys.argv[2]
#     autoBackup(scrDir, dstDir)
path1 = input("请输入源文件路径:")
path2 = input("请输入目标文件路径:")
autoBackup(path1,path2)

2、在上述1程序的基础上,统计备份后的文件总大小、文件总数量、目录总数量

import os
import filecmp
import shutil
import sys

totalSize = 0
fileNum = 0
dirNum = 0

def usage():
    print("scrDir and dstDir must be existing absolute path of certain directory")
    print("For example:{0} c:\\olddir c:\\newdir".format(sys.argv[0]))
    # sys.argv  返回当前工作文件路径
    sys.exit(0) #正常退出


def autoBackup(scrDir, dstDir):

    if ((not os.path.isdir(scrDir)) or (not os.path.isdir(dstDir))  or\
        (os.path.abspath(scrDir) != scrDir) or (os.path.abspath(dstDir) != dstDir)):
        #如果所给两个路径是否为文件夹,并且所给路径和绝对路径相同
        #os.path.isdir(path) 判断path是否为文件夹
        #os.path.abspath(path) 返回path的绝对路径
        usage() #那就输出错误提示

    for item in os.listdir(scrDir): #开始对源文件夹进行遍历
        #os.path.listdir(path)  返回path目录下的文件和目录列表
        scrItem = os.path.join(scrDir, item) #scrtem为scrDir的下一级目录
        #os.path.join(path, *path) 连接两个或多个path
        dstItem = scrItem.replace(scrDir, dstDir) # dstTItem为备份文件夹下与scrItem相同的目录

        if os.path.isdir(scrItem): #如果srcItem是文件夹
            if not os.path.exists(dstItem): #如果备份文件夹里没有这个文件夹
                # os.path.exists(path) 判断文件是否存在
                os.makedirs(dstItem) #那就在备份文件夹里创建它
                #os.makedirs(path)递归创建文件夹目录path
                print("make directory" + dstItem) #输出说创建了一个文件夹目录
            autoBackup(scrItem, dstItem) #因为所创建备份文件夹目录为空,所以需要递归返回函数继续遍历源文件夹,继续备份

        elif os.path.isfile(scrItem): #如果scrItem是文件
            # os.path.isfile(path) 判断path是否为文件
            if ((not os.path.exists(dstItem)) or\
                (not filecmp.cmp(scrItem, dstItem, shallow=True))):
                #如果备份文件夹里没有这个文件,或这个文件与上次备份相比被修改过
                #filecmp.cmp(f1,f2,[shallow]) 比较f1和f2文件内容是否相等,可选参数shallow定义是否考虑文件本身的属性
                shutil.copyfile(scrItem, dstItem) #备份文件
                #shutil.copyfile(f1,f2) 将f1的文件拷贝到f2
                print("file:" + scrItem + "==>" + dstItem) #输出文件备份的提示

def visitDir(path):
    global totalSize # 总文件大小
    global fileNum #文件数量
    global dirNum #文件夹数量

    for lists in os.listdir(path):
        sub_path = os.path.join(path, lists)
        if os.path.isfile(sub_path):
            fileNum = fileNum + 1
            totalSize = totalSize + os.path.getsize(sub_path)
            #os.path.getsize(path) 返回path文件的大小
        elif os.path.isdir(sub_path):
            dirNum = dirNum + 1
            visitDir(sub_path)

def sizeConvert(size): #单位换算
    K, M, G = 1024, 1024**2, 1024**3
    if size >= G:
        x = str(size / G) + "G Bytes"
    elif size >= M:
        x = str(size / M) + "M Bytes"
    elif size >= K:
        x = str(size / K) + "K Bytes"
    else :
        x = str(size) + 'Bytes'
    return x

def output(path):
    visitDir(path2)
    print("The total size of " + path + "is: " \
          + sizeConvert(totalSize) + "(" + str(totalSize) + "Bytes)")
    print("The total number of files in " + path + " is: ", fileNum)
    print("The total number of directories in " + path + " is: ", dirNum)

path1 = input("请输入源文件路径:")
path2 = input("请输入目标文件路径:")
autoBackup(path1,path2)
output(path2)

3、在上述2程序的基础上,统计本次备份的文件总大小、文件总数量、目录总数量

import os
import filecmp
import shutil
import sys

totalSize = 0
fileNum = 0
dirNum = 0

ThisTotalSize = 0
ThisFileNum = 0
ThisDirNum = 0

def usage():
    print("scrDir and dstDir must be existing absolute path of certain directory")
    print("For example:{0} c:\\oldDir c:\\newDir".format(sys.argv[0]))
    # sys.argv  返回当前工作文件路径
    sys.exit(0) #正常退出


def autoBackup(scrDir, dstDir):

    global ThisTotalSize
    global ThisFileNum
    global ThisDirNum

    if ((not os.path.isdir(scrDir)) or (not os.path.isdir(dstDir))  or\
        (os.path.abspath(scrDir) != scrDir) or (os.path.abspath(dstDir) != dstDir)):
        #如果所给两个路径是否为文件夹,并且所给路径和绝对路径相同
        #os.path.isdir(path) 判断path是否为文件夹
        #os.path.abspath(path) 返回path的绝对路径
        usage() #那就输出错误提示

    for item in os.listdir(scrDir): #开始对源文件夹进行遍历
        #os.path.listdir(path)  返回path目录下的文件和目录列表
        scrItem = os.path.join(scrDir, item) #scrtem为scrDir的下一级目录
        #os.path.join(path, *path) 连接两个或多个path
        dstItem = scrItem.replace(scrDir, dstDir) # dstTItem为备份文件夹下与scrItem相同的目录

        if os.path.isdir(scrItem): #如果srcItem是文件夹
            if not os.path.exists(dstItem): #如果备份文件夹里没有这个文件夹
                # os.path.exists(path) 判断文件是否存在
                os.makedirs(dstItem) #那就在备份文件夹里创建它
                ThisDirNum += 1
                #os.makedirs(path)递归创建文件夹目录path
                print("make directory" + dstItem) #输出说创建了一个文件夹目录
            autoBackup(scrItem, dstItem) #因为所创建备份文件夹目录为空,所以需要递归返回函数继续遍历源文件夹,继续备份

        elif os.path.isfile(scrItem): #如果scrItem是文件
            # os.path.isfile(path) 判断path是否为文件
            if ((not os.path.exists(dstItem)) or\
                (not filecmp.cmp(scrItem, dstItem, shallow=True))):
                #如果备份文件夹里没有这个文件,或这个文件与上次备份相比被修改过
                #filecmp.cmp(f1,f2,[shallow]) 比较f1和f2文件内容是否相等,可选参数shallow定义是否考虑文件本身的属性
                shutil.copyfile(scrItem, dstItem) #备份文件
                ThisFileNum += 1
                ThisTotalSize += os.path.getsize(dstItem)
                #shutil.copyfile(f1,f2) 将f1的文件拷贝到f2
                print("file:" + scrItem + "==>" + dstItem) #输出文件备份的提示

def visitDir(path):
    global totalSize # 总文件大小
    global fileNum #文件数量
    global dirNum #文件夹数量

    for lists in os.listdir(path):
        sub_path = os.path.join(path, lists)
        if os.path.isfile(sub_path):
            fileNum = fileNum + 1
            totalSize = totalSize + os.path.getsize(sub_path)
            #os.path.getsize(path) 返回path文件的大小
        elif os.path.isdir(sub_path):
            dirNum = dirNum + 1
            visitDir(sub_path)

def sizeConvert(size): #单位换算
    K, M, G = 1024, 1024**2, 1024**3
    if size >= G:
        x = str(size / G) + "G Bytes"
    elif size >= M:
        x = str(size / M) + "M Bytes"
    elif size >= K:
        x = str(size / K) + "K Bytes"
    else :
        x = str(size) + 'Bytes'
    return x

def output(path):
    visitDir(path2)
    print("The this time backup files size is: " \
          + sizeConvert(ThisTotalSize) + "(" + str(ThisTotalSize) + "Bytes)")
    print("The this time backup files is: ", ThisFileNum)
    print("The this time backup directories is: ",ThisDirNum)
    print("The total size of " + path + "is: " \
          + sizeConvert(totalSize) + "(" + str(totalSize) + "Bytes)")
    print("The total number of files in " + path + " is: ", fileNum)
    print("The total number of directories in " + path + " is: ", dirNum)


path1 = input("请输入源文件路径:")
path2 = input("请输入目标文件路径:")
autoBackup(path1,path2)
output(path2)

4、在上述123程序基础上,对每个文件生产MD5验证文件,存储在一个对应的MD5目录体系

 

5、在上述4程序基础上,对md5验证码一致的文件,另外建立一个单独目录存储,从原文件目录删除该文件,在该处保存文件链接

6、在上述程序基础上,每个目录下检查backup.sh或backup.cmd,调用操作系统命令在备份之前先进行其他内容备份


7、编程对一个目录及其子目录下的py文件计算总行数和不是空行的行数,并按照完整目录
名称进行打印显示
(总行数、非空行数、目录名称)

import os

def Traverse_file(dir):
    for i in os.listdir(dir):
        path = os.path.join(dir,i)
        if os.path.isfile(path) and path[-3:] == '.py':
            with open(path,'r',encoding="utf-8") as py:
                l = py.readlines()
                n = 0
                for j in l:
                    if j.split() != []:
                        n += 1
                print("%d\t  %d\t  %s\n" % (len(l), n, path))
        elif os.path.isdir(path):
            Traverse_file(path)

path = input("请输入所需检索文件目录:")
print("总行数","非空行数","目录名称")
Traverse_file(path)

未完待续。。。

好的,下面是一个简单的 Python 程序,用于进行文件夹增量备份: ```python import os import shutil import time # 源文件夹路径 src_folder = '/path/to/source/folder' # 目标文件夹路径 dst_folder = '/path/to/destination/folder' # 获取上一次备份的间戳 last_backup_time = os.path.join(dst_folder, '.last_backup_time') if os.path.exists(last_backup_time): with open(last_backup_time, 'r') as f: last_backup_timestamp = int(f.read().strip()) else: last_backup_timestamp = 0 # 备份当前间戳 current_timestamp = int(time.time()) with open(last_backup_time, 'w') as f: f.write(str(current_timestamp)) # 遍历源文件夹 for root, dirs, files in os.walk(src_folder): for file in files: # 获取文件路径和修改间戳 file_path = os.path.join(root, file) file_timestamp = int(os.path.getmtime(file_path)) # 如果文件的修改间戳大于上一次备份的间戳,则进行备份 if file_timestamp > last_backup_timestamp: # 构造目标文件夹路径(保持源文件夹的相对路径) relative_path = os.path.relpath(root, src_folder) dst_path = os.path.join(dst_folder, relative_path, file) # 备份文件 shutil.copy2(file_path, dst_path) ``` 这个程序会遍历源文件夹中的所有文件,并将修改间戳大于上一次备份的间戳的文件备份到目标文件夹中。备份的目标路径保持源文件夹的相对路径不变。上一次备份的间戳存储在目标文件夹中的一个名为 `.last_backup_time` 的文件中。每次备份之前,程序都会读取这个文件中的间戳,并将当前间戳写入该文件,以便下一次备份使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值