[关闭]
@zhangyu756897669 2017-09-18T14:26:02.000000Z 字数 3326 阅读 603

项目:将文件夹备份到ZIP文件中

未分类


假设您正在处理一个项目,其文件位于名为C:\ AlsPythonBook的文件夹中。你担心丢失你的文件,所以你想要创建整个文件夹的ZIP文件“快照”。您希望保留不同的版本,因此您希望ZIP文件的文件名每次都会增加;例如,AlsPythonBook_1.zip,AlsPythonBook_2.zip,AlsPythonBook_3.zip等。你可以用手来做,但这很烦人,你可能不小心误写ZIP文件的名字。运行一个为您做这个无聊的任务的程序会简单得多。
对于此项目,打开一个新的文件编辑器窗口并将其另存为backupToZip.py。

步骤1:找出ZIP文件的名称

该程序的代码将被放入名为backupToZip()的函数中。这样可以轻松地将该功能复制并粘贴到需要此功能的其他Python程序中。在程序结束时,将调用该函数来执行备份。让你的程序看起来像这样:

  1. import zipfile, os #❶
  2. def backupToZip(folder):
  3. #将“文件夹”的全部内容备份到ZIP文件中。
  4. folder = os.path.abspath(folder) #确保文件夹是绝对的
  5. #找出这个代码应该使用的文件名
  6. # 什么文件已经存在
  7. number = 1 #❷
  8. while True: #❸
  9. zipFilename = os.path.basename(folder) + '_' + str(number) + '.zip'
  10. if not os.path.exists(zipFilename):
  11. break
  12. number = number + 1
  13. print('Done.')
  14. #创建ZIP文件。 #❹
  15. #遍历整个文件夹树并压缩每个文件夹中的文件。
  16. backupToZip('C:\\delicious')

定义一个只有一个参数文件夹的backupToZip()函数。该参数是要备份其内容的文件夹的字符串路径。该函数将确定要为其创建的ZIP文件使用哪个文件名?那么该功能将创建文件,步行文件夹文件夹,并将每个子文件夹和文件添加到ZIP文件。在源代码中编写这些步骤的注释,以提醒自己稍后再做。❹

第一部分,命名ZIP文件,使用文件夹的绝对路径的基本名称。如果正在备份的文件夹是C:\ delicious,则ZIP文件的名称应为delicious_N.zip,其中N = 1是您第一次运行程序,N = 2是第二次,依此类推。

可以通过检查delicious_1.zip是否已经存在,然后检查delicious_2.zip是否已经存在,以此确定哪个N应该是。对N❷使用名为number的变量,并在调用os.path.exists()的循环内继续增加,以检查文件是否存在❸。找到的第一个不存在的文件名会导致循环中断,因为它会找到新的zip的文件名。

步骤2:创建新的ZIP文件

接下来我们来创建ZIP文件。使您的程序如下所示:

  1. import zipfile, os #❶
  2. def backupToZip(folder):
  3. #将“文件夹”的全部内容备份到ZIP文件中。
  4. folder = os.path.abspath(folder) #确保文件夹是绝对的
  5. #找出这个代码应该使用的文件名
  6. # 什么文件已经存在
  7. number = 1 #❷
  8. while True: #❸
  9. zipFilename = os.path.basename(folder) + '_' + str(number) + '.zip'
  10. if not os.path.exists(zipFilename):
  11. break
  12. number = number + 1
  13. print('Done.')
  14. #创建ZIP文件。 #❹
  15. #遍历整个文件夹树并压缩每个文件夹中的文件。
  16. while True:
  17. zipFilename = os.path.basename(folder) + '_' + str(number) + '.zip'
  18. if not os.path.exists(zipFilename):
  19. break
  20. number = number + 1
  21. #创建ZIP文件。
  22. print('Creating %s...' % (zipFilename))
  23. backupZip = zipfile.ZipFile(zipFilename, 'w') #❶
  24. #遍历整个文件夹树并压缩每个文件夹中的文件。
  25. print('Done.')
  26. backupToZip('C:\\delicious')

现在新的ZIP文件的名称存储在zipFilename变量中,可以调用zipfile.ZipFile()来实际创建ZIP文件❶。一定要把'w'作为第二个参数,以便在写入模式下打开ZIP文件。

步骤3:遍历目录树并添加到ZIP文件

现在,您需要使用os.walk()函数来完成列出文件夹及其子文件夹中每个文件的工作。使您的程序如下所示:

  1. import zipfile, os #❶
  2. def backupToZip(folder):
  3. #将“文件夹”的全部内容备份到ZIP文件中。
  4. folder = os.path.abspath(folder) #确保文件夹是绝对的
  5. #找出这个代码应该使用的文件名
  6. # 什么文件已经存在
  7. number = 1 #❷
  8. while True: #❸
  9. zipFilename = os.path.basename(folder) + '_' + str(number) + '.zip'
  10. if not os.path.exists(zipFilename):
  11. break
  12. number = number + 1
  13. print('Done.')
  14. #创建ZIP文件。 #❹
  15. #遍历整个文件夹树并压缩每个文件夹中的文件。
  16. while True:
  17. zipFilename = os.path.basename(folder) + '_' + str(number) + '.zip'
  18. if not os.path.exists(zipFilename):
  19. break
  20. number = number + 1
  21. #创建ZIP文件。
  22. print('Creating %s...' % (zipFilename))
  23. backupZip = zipfile.ZipFile(zipFilename, 'w') #❶
  24. #遍历整个文件夹树并压缩每个文件夹中的文件。
  25. print('Done.')
  26. #遍历整个文件夹树并压缩每个文件夹中的文件。
  27. for foldername, subfolders, filenames in os.walk(folder): #❶
  28. print('Adding files in %s...' % (foldername))
  29. # 将当前文件夹添加到ZIP文件
  30. backupZip.write(foldername) #❷
  31. #将此文件夹中的所有文件添加到ZIP文件。
  32. for filename in filenames: #❸
  33. newBase = os.path.basename(folder) + '_'
  34. if filename.startswith(newBase) and filename.endswith('.zip'):
  35. continue ## 不备份ZIP文件
  36. backupZip.write(os.path.join(foldername, filename))
  37. backupZip.close()
  38. print('Done.')
  39. backupToZip('C:\\delicious')

您可以在for循环❶中使用os.walk(),并且在每次迭代时,它将返回迭代的当前文件夹名称,该文件夹中的子文件夹以及该文件夹中的文件名。
在for循环中,文件夹被添加到ZIP文件❷。嵌套for循环可以通过文件名列表中的每个文件名❸。每个都添加到ZIP文件,除了以前制作的备份ZIP。

当您运行此程序时,它将产生如下所示的输出:

Done.
Creating delicious_2.zip...
Done.
Done.

第二次运行它时,它会将所有文件放在C:\ delicious中,这个ZIP文件名为delicious_2.zip,依此类推。

类似程序的想法

您可以遍历一个目录树,并在其他几个程序中将文件添加到压缩的ZIP存档。例如,您可以编写执行以下操作的程序:
* 遍历一个目录树,并只归档具有某些扩展名的文件,例如.txt或.py,没有别的
* 遍历一个目录树并归档除.txt和.py之外的每个文件
* 找到文件数量最多的目录树中的文件夹或使用最多磁盘空间的文件夹

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注