代码来自网络,我进行了一些注释与修改
要个点赞关注没问题吧
程序功能与用法:
指定源文件夹与目标文件夹,自动检测自上次备份以来源文件夹中内容的改变,
包括修改的文件、新建的文件、新建的文件夹等等,自动复制新增或修改过的文件到目标文件夹中,
自上次备份以来没有修改过的文件将被忽略而不复制,从而实现增量备份。
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)
未完待续。。。