删库跑路?在我这里永远不可能!我有自动备份文件的程序!
该程序包含以下个文件: 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,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:笔驱动器存在时的输出 如何运行该程序 进群:960410445?? 执行如图1所示的命令后,检查名为Sync的文件夹。在此文件夹中,检查名为dist的文件夹,您将在其中获取.exe文件。现在复制此.exe文件并将其粘贴到C:/ Windows文件夹中,如图2所示。 现在打开命令提示符。检查当前文件夹,如图3所示。在我的PC中,默认提示路径为c:/ user / Mohit。在您的PC中,它可能会有所不同。因此,复制Sync1.ini文件并将其粘贴到c:/ user / 现在插上外接笔式驱动器。检查笔式驱动器盘符,它在我的PC中是E. 根据您的PC配置,更改放置在C:/ user / 现在打开命令提示符并键入命令,如图4所示。 现在检查你的驱动器,查看sync.log,它是在文件夹c:/ user / 有四种情况可能:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |