zoukankan      html  css  js  c++  java
  • 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!
  • 相关阅读:
    LDAP个人理解
    webpack-dev-middleware 与 webpack-hot-middlware
    RFC、EMCA-262、TC-39等名词
    贝塞尔曲线
    Async/await语法糖实现(Generator)
    Promise嵌套问题/async await执行顺序
    JS对象中,在原型链上找到属性后 最终将值拷贝给原对象 而不是引用
    三列布局中 float引发的一个问题-当“非float的元素”和“float的元素”在一起的时候,如果非float元素在先,那么float的元素将受到排斥。
    05-Linux系统编程-第02天(文件系统、目录操作、dup2)
    降低30%视频码率,窄带高清技术实现揭秘
  • 原文地址:https://www.cnblogs.com/fengf1/p/7809261.html
Copyright © 2011-2022 走看看