Byte of Python学习笔记(1)——Zipfile练习

  最近开始学习Python,先看了一些廖雪峰,看到单元测试的部分渐渐觉得有些吃力,然后在知乎上发现大多数人都在推荐使用Byte of Python进行入门,即简明Python教程。进行了一部分阅读之后发现这本书确实很适合入门。因此推荐先看一下这本书对python进行初步的了解,本人水平有限,现将学习过程中的一些心得记录如下, 希望各位看到这篇文章的大佬对不正确的地方进行批评指正。在此谢过。

  在此贴出本书的在线阅读地址:https://www.gitbook.com/book/lenkimo/byte-of-python-chinese-edition/details

  感谢大佬的无私奉献:https://zhuanlan.zhihu.com/p/24672770

  前面的基础知识比较易懂,在阅读到解决问题的部分时,书中以常见的Zip命令为例,编写了数个版本的程序,其中前面几个版本的程序均使用了zip命令, 由于本人目前使用的平台还是windows,在windows平台使用zip命令需要首先安装GnuWin32,并且使用了os.system运行shell命令,多有不便,在书中也提出了使用内置的zipfile模块进行压缩,书中并没有给出代码,因此提供我的代码如下:

 1 import zipfile
 2 import os
 3 import time
 4 
 5 source = [r'F:\PythonTestMytestdata']   #需要进行压缩的目录
 6 if not os.path.exists(source[0]):
 7     print('The path is not exist!')
 8 target_dir = r'F:\PythonTestipbackup'  #压缩包存放的地址
 9 if not os.path.exists(target_dir):
10     os.mkdir(target_dir)
11 
12 target_name = target_dir +os.sep+time.strftime('%Y%m%d')+'_backup.zip' #压缩包名,以当前日期命名
13 myzip = zipfile.ZipFile(target_name,'w')    #创建压缩包
14 for current_path, dirnames, filesname in os.walk(source[0]):  #通过os.walk对目标路径内所有文件进行遍历
15     for file in filesname:
16         target_path = current_path.split('\')[3:]  #切片
17         target_path = '\'.join(target_path)
18         target_path = target_path+os.sep+file        #压缩包内的文件存放路径
19         # target_path = file
20         myzip.write((os.path.join(current_path,file)),target_path)  #写入压缩文件
21         print('Zipping: %s' %os.path.join(current_path,file))
22 print('Zip success!')
23 myzip.close()   #释放资源

Zipfile不同于GnuWin32中的zip命令,不能直接将一个文件夹内的文件用一行语句全部压缩,因此需要使用os.walk进行遍历,os.walk返回一个三维元组,分别是起始路径,起始路径下的文件夹,以及起始路径内的文件。

在这里我使用了一个切片的操作,是因为我的压缩的路径是F:\PythonTestMytestdata,而我希望将压缩包内含的文件从MyTestdata开始,如果不使用切片操作的话,压缩包会将MyPythonTest文件夹也包含在内。

调用zipfile.write对压缩包进行压缩的操作,官方文档中对该函数的解释如下:

可知write函数中的第二个参数为压缩后的目标路径,通过修改这个参数可以修改他的名称和路径。

另外还使用了time模块中的strftimr函数,用来输出当前的时间,有关该函数,需要注意的就是他的一些输出格式,如下:

还有一个需要注意的问题即是斜杠的问题,在windows中使用的是“”进行分割,而在Linux系统中使用的则是"/"。为了避免混淆,可以使用os.sep,可以自动根据当前的系统输出斜杠。另外注意在输入字符串的时候,请注意斜杠的输入,应为‘\’输出一个斜杠,注意转义字符,或者在字符串前面加r,使其不进行转义。

运行之后的输出如下:

Zipping: F:\PythonTestMytestdata图片	est.JPG
Zipping: F:\PythonTestMytestdata音乐まふまふ - 病名は愛だった.mp3
Zip success!
原文地址:https://www.cnblogs.com/fengf1/p/7809261.html