zoukankan      html  css  js  c++  java
  • Python之路(第十八篇)shutil 模块、zipfile模块、configparser模块

    一、shutil 模块

    1、shutil.copyfileobj(fsrc, fdst[, length])

    将文件内容拷贝到另一个文件中,需要打开文件

      import shutil
      shutil.copyfileobj(open("old_test.txt","r"),open("new_test.txt","w"))
    

      

    输出结果

     

     

     

    2、shutil.copyfile(src,dst)

    复制文件内容到另外一个文件,不需要打开文件,事实上,copyfile调用了copyfileobj

      
      import shutil
      shutil.copyfile("old_test.txt","new.txt")
    

      

    输出结果

     

     

     

    3、shutil.copymode(src,dst)

    仅copy权限,不更改文件内容,组和用户。

      
      import shutil
      shutil.copymode("old_test.txt","new.txt")
    

      

    输出结果

     

     

     

    4、shutil.copystat(src, dst)

    仅拷贝权限。内容、组、用户均不变

      
      import shutil
      shutil.copystat("old_test.txt","new.txt")
    

      

    输出结果

     

     

    5、shutil.copy(src, dst)

    拷贝文件和权限

      
      import shutil
      shutil.copy("old_test.txt","new.txt")
    

      

    输出结果

     

     

    6、shutil.copy2(src, dst)

    拷贝文件和状态信息

      
      import shutil
      shutil.copy2("old_test.txt","new.txt")
    

      

    输出结果

     

    7、shutil.copytree(src, dst, symlinks=False, ignore=None)

    shutil.copytree

    递归的去拷贝文件夹,要对写入的目录有写权限

    例子

      
      shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('__init__.py', 'tmp*'))
      #shutil.ignore_patterns(*patterns) #ignore代表排除
    

      

    输出结果

     

    8、shutil.rmtree(path[, ignore_errors[, onerror]])

    递归的去删除文件

      
      shutil.rmtree('folder1')
    

      

    9、shutil.move(src, dst)

    递归的去移动文件,它类似mv命令,其实就是重命名。dst可以是文件名也可以是目录,目标文件存在则覆盖。

      
      shutil.move('folder1', 'folder3')
    

      

    例子

      
      import shutil
      shutil.move("a","temp")
    

      

    输出结果

     

    10、shutil.make_archive(base_name, format,...)

    创建压缩包并返回文件路径,例如:zip、tar

    创建压缩包并返回文件路径,例如:zip、tar

    • base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,

    • format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”

    • root_dir: 要压缩的文件夹路径(默认当前目录),将哪个目录或者文件打包(也就是源文件)

    • owner: 用户,默认当前用户

    • group: 组,默认当前组

    • logger: 用于记录日志,通常是logging.Logger对象

    例子

      import shutil
      shutil.make_archive("test_package_bak","zip","test_package")
      #对文件夹下的test_package文件夹进行打包
    

      

    输出结果

     

    11、shutil.unpack_archive()

    解压,可指定解压目录,否则默认解压到当前工作目录

    
    
    shutil.unpack_archive(filename=hh, extract_dir=local_dir)
    

      

    例子

      import shutil
      shutil.unpack_archive("test_package_bak.zip",extract_dir=r"D:	1")
    

      

    输出结果

     

     

     

    二、zipfile模块压缩&解压缩

    shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,详细:zipfile压缩&解压缩,tarfile压缩&解压缩

    简单压缩例子

    zipfile.ZipFile(fileName[, mode[, compression[, allowZip64]]])
    

      

    参数说明

    • fileName:压缩后的文件名,
    • mode和一般的文件操作一样,'r'表示打开一个存在的只读ZIP文件;'w'表示清空并打开一个只写的ZIP文件,或创建一个只写的ZIP文件;'a'表示打开一个ZIP文件,并添加内容。
    • compression表示压缩格式,可选的压缩格式只有2个:ZIP_STORE;ZIP_DEFLATED。ZIP_STORE是默认的,表示不压缩;ZIP_DEFLATED表示压缩(即有压缩率)
    • allowZip64为True时,表示支持64位的压缩,一般而言,在所压缩的文件大于2G时,会用到这个选项;默认情况下,该值为False,因为Unix系统不支持。
    f.write(f(filename[,arcname[,compression_type]])
    

      

    将文件写入zip文件中,即将文件压缩

    将zip外的文件filename写入到名为arcname的子文件中(当然arcname也是带有相对zip包的路径的),compression_type指定了压缩格式,也是ZIP_STORED或ZIP_DEFLATED。f的打开方式一定要是w或者a才能顺利写入文件。

    压缩例子

      import zipfile
      ​
      f = zipfile.ZipFile("test.zip",mode="w",compression=zipfile.ZIP_DEFLATED)
      f.write("old_test.txt")   #也可以写文件完整路径名
      f.write("test.py")
      f.close()
      print(f.namelist())  #查看压缩包文件列表,f是ZipFile实例化出来的对象,这里调用namelist()方法
    

      

    输出结果

      
      ['old_test.txt', 'test.py']
    

      

    有两个方法比较类似,注意区分。

    • f.write指的是将已经存在的文件复制到压缩包,包括路径中的所有文件夹河其下的文件。

    • f.writestr是直接在压缩包里新建文件夹和文件,data参数是往该文件中写入的内容。

    解压例子

    f.extract(member[,path[,pwd]])从zip中提取一个文件,将它放到指定的path下,pwd是密码,用于被加密的zip文件,member是要提取的文件名

    f.extractall(path[,pwd])  将所有文件按照namelist中显示得那样的目录结构从当前zip中提取出来并放到path下。

    path解压缩目录 ,password当zip文件有密码时需要该选项

    例子

      import zipfile
      f = zipfile.ZipFile("test_package.zip",mode="r") #注意此时解压不要用"w"格式,用"w"格式将清空压缩包文件
      f.extractall(path=r"d:	estaaa")  #将压缩包解压到d:	estaaa下
      f.extract("old_test.txt")  #提取压缩包中的一个文件到当前目录
      f.close()
    

      

    输出结果

     

    高级应用

    zipfile.is_zipfile(filename) 判断一个文件是不是压缩文件

    ZipFile.namelist() 返回文件列表

    例子

      import zipfile
      f = zipfile.ZipFile("test_package.zip",mode="r") #注意此时解压不要用"w"格式,用"w"格式将清空压缩包文件
      print(f.namelist())
      print(zipfile.is_zipfile("test_package.zip"))
    

      


    注意此时解压不要用"w"格式,用"w"格式将清空压缩包文件

    输出结果

      ['encode_decode问题.py', 'new_test.txt', 'old_test.txt', 'test.py', 'test.xml', 'test1.py', 'test2.py', 'test3.py', 'test6.py', 'testxml.xml', '客户端1.py', '服务端.py']
      True
      ​
    

      

    三、configparser模块

    configparse模块用于生成和修改,解析(读取分析,获得数据)常见配置文档,多数此类配置文件名格式为XXX.ini,例如mysql的配置文件。

    当前模块的名称在 python 3.x 版本中变更为 configparser。(python2首字母大写)

    配置文件示例说明

      
      ##### ini 文件示例 ########
       
      [section1]      
      name = nicholas
      age = 18
        
      [section2]
      name:python
      age = 19
       
      #### 文件格式说明 #########
      [XXX]  代表节点
      XX = XX 或者 XX : XX 代表参数
      #支持的两种分隔符“=”, “:”
     
    

      

    例子

    配置文件内容

    文件名"test.ini"

    文件内容

      
      [DEFAULT]
      default_mykey=myvalue
      ​
      [Section_a]
      Keya1=valuea1
      Keya2=valuea2
      Keya3=valuea3
      ​
      [Section_b]
      keyb1=valueb1
      keyb2=valueb2
      keyb3=valueb3
      ​
      [Db]
      db_host=127.0.0.1
      db_port=5432
      db_user=admin
      db_pass=Letmein
      db_name=test
      db_url = jdbc:postgresql://%(db_host)s:%(db_port)s/%(db_name)s
    

      

    python文件操作

      
      import configparser
      ​
      con = configparser.ConfigParser()  #实例化创建一个对象
      con.read("test.ini")  #调用对象的read方法读取配置文件
      ​
      print(con.sections())  #获取所有节点名称,默认不显示DEFAULT
      # 输出结果  ['Section_a', 'Section_b', 'Db']
      ​
      print(con.options('Section_a'))  #获取指定节点的所有key
      # 输出结果 ['keya1', 'keya2', 'keya3', 'default_mykey']
      # 注意在处理键值对数据时,会将键名 全部转化为小写,同时自动加上默认的节点键值
      ​
      print(con.items('Section_a')) #获取指定节点的键值对
      #输出结果 [('default_mykey', 'myvalue'), ('keya1', 'valuea1'), ('keya2', 'valuea2'), ('keya3', 'valuea3')]
      # 这里输出结果也是自动加上默认的键值对
      ​
      print(con.get('Section_a',"keya1"))  #获取指定节点的指定key的value
      # 输出结果  valuea1
      ​
      print(con.getint("Db","db_port"))  #获取节点section1的age属性,属性需要是int型,否则ValueError
      # 输出结果 5432
      ​
      print(con.has_section("section"))  #检查指定节点是否存在,返回True或False
      # 输出结果 False
      ​
      print(con.has_option("Section_a","keya1"))  #检查指定节点中是否存在某个key,返回True或False
      # 输出结果 True
      ​
      ​
      # 循环查找节点中的key
      for i in con["Section_a"]:
          print(i)
      ​
      # 通过字典的形式取值
      data = con["Section_a"]["keya1"]
      print(data)
      # 输出结果 valuea1
      ​
      # 判断节点在不在对象里
      print("Section_a" in con)
      # 输出结果 True
    

      

    其它增删改查语法

      import configparser
      ​
      con = configparser.ConfigParser()  #实例化创建一个对象
      con.read("test.ini")  #调用对象的read方法读取配置文件
      ​
      con.add_section("new_section") #添加一个节点,节点名为new_section, 此时添加的节点尚未写入文件,
                                     # 需要write方法写入文件
      ​
      con.remove_section("Section_b")  #删除一个节点,节点名为Section_b, 删掉了内存中的节点,
                                       # 但文件中的还没删除,需要write方法删除,也有remove_option
                                       
      ​
      con.set("Section_a", "k1", "v1") # 在已存在的节点中添加一个键值对k1 = v1 ,
                                       # 如果该节点不存在则报错,如果key已经存在,则修改value,这里也需要
                                       #有 write方法对文件进行操作
      ​
      con.write(open("test.ini", "w"))  #将修改写入文件
    

      

    输出结果

     

    补充remove_option(section, option)

    从指定的节点中删除指定的选项。如果该部分不存在,请提出NoSectionError。如果存在的选项被删除,返回True;否则返回False。

     

  • 相关阅读:
    C#中调用Outlook API 发起会议
    Log4Net配置
    web端调用Webapi获取Excel表格
    表格导出之Aspose.Cells
    验证输入框
    把新建的对象所有属性变成默认值
    省市区三级联动
    全局异常处理
    HttpHttpServletRequest / Reponse
    热部署
  • 原文地址:https://www.cnblogs.com/Nicholas0707/p/9102651.html
Copyright © 2011-2022 走看看