丢失或删除的文件是一种常见现象。为谨慎起见,要确保文件/文件夹的安全性,需要我们经常进行备份。为了避免不出现这样恢复的苦差事,最好自动化这个过程。本文作者为这种情况创建了一个Python脚本程序。
学习Python中有不明白推荐加入交流群
号:960410445
群里有志同道合的小伙伴,互帮互助,
群里有不错的视频学习教程和PDF!
我们经常在计算机中创建新文档,文件和文件夹。有时会意外或错误地删除文档。我们花了不少时间在上面做了一个重要的演示文档。但一不小心,计算机硬盘崩溃了。这是一个很棘手的问题。人们也会经常备份文件。但是每隔一小时或每分钟后很难做到。为了解决这个问题,我们创建一个Python脚本,它可以在指定的时间段(可由用户自定义)后备份文件或文件夹。该程序的名称是sync.py.
它适用于Windows系统,并且与Python 2和Python 3兼容。
该程序包含以下个文件:
Sync.py:主程序
Sync1.ini:配置文件
Logger1.py:记录器支持的模块
Sync.log是sync.py创建的文件。
现在让我们了解sync.py的代码,看看它是如何工作的。
1.导入要使用的基本库。
Import configparser.
Import time.
Import shutil.
Import hashlib.
From the distutils.dir_util import copy_tree.
From the collections, import OrderedDict.
Import the OS.
Import logger1 as log1.
以下代码为读取Sync1.ini文件:
def ConfRead():
config = configparser.ConfigParser()
config.read(“Sync1.ini”)
return (dict(config.items(“Para”)))
下面显示的是从Sync.ini文件中获得的一些变量:
All_Config = ConfRead()
Freq = int(All_Config.get(“freq”))*60
Total_time = int(All_Config.get(“total_time”))*60
repeat = int(Total_time/Freq)
图1:使用pyinstaller创建一个exe文件
图2:将exe文件放在Windows文件夹中
以下函数md5用于计算文件的哈希值。如果修改文件,则名称保持不变,但哈希值会更改。
def md5(fname,size=4096):
hash_md5 = hashlib.md5()
with open(fname, “rb”) as f:
for chunk in iter(lambda: f.read(size), b””):
hash_md5.update(chunk)
return hash_md5.hexdigest()
以下函数使用中介复制整个目录:
def CopyDir(from1, to):
copy_tree(from1, to)
以下函数只将一个文件复制到目标位置:
def CopyFiles(file, path_to_copy):
shutil.copy(file,path_to_copy)
图3:CMD默认路径
图4:同步命令
以下函数创建一个字典,其中包含带有文件哈希的文件名。该函数获取源位置并生成所有文件的字典:
def OriginalFiles():
drive = All_Config.get(“from”)
Files_Dict = OrderedDict()
print (drive)
for root, dir, files in os.walk(drive, topdown=True):
for file in files:
file = file.lower()
file_path = root+’\’+file
try:
hash1 = md5(file_path,size=4096)
#modification_time = int(os.path.getmtime(file_path))
rel_path = file_path.strip(drive)
Files_Dict[(hash1,rel_path)]= file_path
except Exception as e :
log1.logger.error(‘Error Original files: {0}’.format(e))
return Files_Dict
以下的函数创建一个字典,其中包含带有文件哈希的文件名。该函数获取目标位置并获取所有当前文件并生成字典。如果根文件夹不存在,则调用CopyDir函数。
def Destination():
Files_Dict = OrderedDict()
from1 = All_Config.get(“from”)
to= All_Config.get(“to”)
dir1= from1.rsplit(“\”,1)[1]
drive = to+dir1
#print (drive)
try:
if os.path.isdir(drive):
for root, dir, files in os.walk(drive, topdown=True):
for file in files:
file = file.lower()
file_path = root+’\’+file
try:
hash1 = md5(file_path,size=4096)
#modification_time = int(os.path.getmtime(file_path))
rel_path = file_path.strip(drive)
Files_Dict[(hash1,rel_path)]= file_path
except Exception as e :
log1.logger.error(‘Error Destination foor loop: {0}’.format(e))
return Files_Dict
else :
CopyDir(from1,drive)
log1.logger.info(‘Full folder: {0} copied’.format(from1))
return None
except Exception as e :
log1.logger.error(‘Error Destination: {0}’.format(e))
以下函数定义如下逻辑:
如果已使用文件夹创建文件。
如果文件已被修改。
图5:复制完整文件夹
图6:修改文件后
在这两种情况下,下面的代码只是比较原始字典和目标字典。如果创建或修改了任何文件,则解释器将从源复制文件并将其粘贴到目标中。
def LogicCompare():
from1 = All_Config.get(“from”)
to= All_Config.get(“to”)
Dest_dict = Destination()
if Dest_dict:
Source_dict = OriginalFiles()
remaining_files = set(Source_dict.keys())- set(Dest_dict.keys())
remaining_files= [Source_dict.get(k) for k in remaining_files]
for file_path in remaining_files:
try:
log1.logger.info(‘File: {0}’.format(file_path))
dir, file = file_path.rsplit(“\”,1)
rel_dir = from1.rsplit(“\”,1)[1]
rel_dir1 = dir.replace(from1,””)
dest_dir = to+rel_dir+”\”+rel_dir1
if not os.path.isdir(dest_dir):
os.makedirs(dest_dir)
CopyFiles(file_path, dest_dir)
except Exception as e:
log1.logger.error(‘Error LogicCompare: {0}’.format(e))
下面的代码使用循环来反复运行代码:
i = 0
while True:
if i >= repeat:
break
LogicCompare()
time.sleep(Freq)
i = i +1
来看Sync1.ini的文件内容:
[Para]
From = K:esting1
To = E:
Freq = 1
Total_time = 5
在上面的代码中:
From:指定源目录并获取testing1文件夹的备份。
To:指定备份的位置。
Freq:在指定多少分钟后进行备份。
Total_time:运行Total_time分钟的代码时长。
我们来看看logger1.py的代码:
import logging
logger = logging.getLogger(“Mohit”)
logger.setLevel(logging.INFO)
fh = logging.FileHandler(“Sync.log”)
formatter = logging.Formatter(‘%(asctime)s - %(levelname)s - %(message)s’)
fh.setFormatter(formatter)
logger.addHandler(fh)
上面的代码非常简单,可以在INFO模式下使用。
如果你不想使用解释器来运行代码,可以创建一个Windows exe文件,这将作为命令。转换它可以用pyinstaller,我已经安装了那个模块。
图1中的命令将您的代码转换为exe文件,运行它不需要Python解释器。
图7:创建新文件后
图8:笔驱动器存在时的输出
如何运行该程序
执行如图1所示的命令后,检查名为Sync的文件夹。在此文件夹中,检查名为dist的文件夹,您将在其中获取.exe文件。现在复制此.exe文件并将其粘贴到C:/ Windows文件夹中,如图2所示。
现在打开命令提示符。检查当前文件夹,如图3所示。在我的PC中,默认提示路径为c:/ user / Mohit。在您的PC中,它可能会有所不同。因此,复制Sync1.ini文件并将其粘贴到c:/ user / <your-name>文件夹中。
现在插上外接笔式驱动器。检查笔式驱动器盘符,它在我的PC中是E.
根据您的PC配置,更改放置在C:/ user / <your-name>目录中的Sync1.ini参数。
现在打开命令提示符并键入命令,如图4所示。
现在检查你的驱动器,查看sync.log,它是在文件夹c:/ user / <your-name>中被创建的。
有四种情况可能:
当驱动器中没有整个文件夹时(图5)。
修改现有文件时(图6)。
创建新文件时(图7)。
最后一种情况是当笔驱动器不存在时的负面测试案例(图8)。
学习Python中有不明白推荐加入交流群
号:960410445
群里有志同道合的小伙伴,互帮互助,
群里有不错的视频学习教程和PDF!
网友评论