一、定义模块:
  模块:用来从逻辑上组织python代码(变量、函数、类、逻辑:实现一个功能),本质就是以.py结尾的python文件(文件名:test.py ,对应的模块名就是test)
  包:用来从逻辑上组织模块的,本质就是一个目录(必须带有__init__.py的文件)
二、导入方法:
  1、import module_guyun

  1. #命名为module_guyun.py
  2. #需要导入的模块内容
  3. #!/usr/bin/env python
  4. # -*- coding: utf-8 -*-
  5. # Author :GU
  6. name = "guyun"
  7. def say_hallo():
  8. print("hello guyun")
  9. ########################
  10. #导入模块
  11. #!/usr/bin/env python
  12. # -*- coding: utf-8 -*-
  13. # Author :GU
  14. import module_guyun
  15. print(module_guyun.name)
  16. module_guyun.say_hallo()
  17. 执行结果:
  18. guyun
  19. hello guyun

  2、from module_alex import logger as logger_guyun #别名

  当要导入的模块与本模块命名重复时,别名要导入的模块可以解决这个问题

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # Author :GU
  4. name = "guyun"
  5. def say_hallo():
  6. print("hello guyun")
  7. def logger():
  8. print("in the module_guyun")
  9. def running():
  10. pass
  11. ##################
  12. #!/usr/bin/env python
  13. # -*- coding: utf-8 -*-
  14. # Author :GU
  15. from module_guyun import logger as logger_guyun
  16. def logger():
  17. print("in the main")
  18. logger()
  19. logger_guyun()
  20. ##执行结果:
  21. in the main
  22. in the module_guyun

  3、导入一个包实际的本质就是导入一个__init__.py

  包package_test里面的init文件

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # Author :GU
  4. print("from test package package_test")

  现在把package_testp_test文件导入p_test

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # Author :GU
  4. import package_test
  5. ##执行结果:
  6. from test package package_test

  4、当文件目录不再同一级目录之后该如何调用

  -module_test

    -main.py

  -module_guyun.py

  现在main.py去调用module_guyun.py

  1. #module_guyun.py文件
  2. #!/usr/bin/env python
  3. # -*- coding: utf-8 -*-
  4. # Author :GU
  5. name = "guyun"
  6. def say_hallo():
  7. print("hello guyun")
  8. def logger():
  9. print("in the module_guyun")
  10. def running():
  11. pass
  12. ##main.py文件
  13. #!/usr/bin/env python
  14. # -*- coding: utf-8 -*-
  15. # Author :GU
  16. #from module_guyun import logger as logger_guyun
  17. import sys,os
  18. x = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  19. #print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
  20. sys.path.append(x)
  21. import module_guyun
  22. module_guyun.say_hallo()
  23. module_guyun.logger()
  24. ####
  25. #执行结果:
  26. hello guyun
  27. in the module_guyun

  5、如何导入一个包

  -package_test

    -test1.py

    -__init__.py

  -p_test.py

  1. #init文件
  2. #!/usr/bin/env python
  3. # -*- coding: utf-8 -*-
  4. # Author :GU
  5. print("from test package package_test")
  6. from . import test1
  7. #test1文件
  8. #!/usr/bin/env python
  9. # -*- coding: utf-8 -*-
  10. # Author :GU
  11. def test():
  12. print("in the test1")
  13. ###调用文件
  14. #!/usr/bin/env python
  15. # -*- coding: utf-8 -*-
  16. # Author :GU
  17. import package_test ###执行init.py文件
  18. package_test.test1.test()
  19. #执行结果:
  20. from test package package_test
  21. in the test1
  22. ####达到的目的就是在同一级目录倒入一个包的文件,中间通过init文件调度

总结

  •   import module_alex
  •   import module_alex,module2_alex #调用多个模块
  •   for module_alex import *    ###不建议用
  •   from module_alex import m1,m2,m3   ##调用一个模块中的多个小模块
  •   from module_alex import logger as logger_alex  ###别名

三、import本质(路径搜索和搜索路径)

  导入模块的本质就是把python文件解释一遍

  import moile_name ------->module_name.py ----->module_name.py的路径----->sys.path
导入包的本质就是在执行这个包里面的__init__.py文件

四、导入优化
  aaarticlea/png;base64,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" alt="" width="312" height="224" />

五、模块的分类
 a:标准库(内置)

 b:开源模块

 c:自定义模块

  1、标准库

  a、time和datetime

  在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素。由于Python的time模块实现主要调用C库,所以各个平台可能有所不同。

  UTC(Coordinated Universal Time,世界协调时)亦即格林威治天文时间,世界标准时间。在中国为UTC+8。DST(Daylight Saving Time)即夏令时。

  时间戳(timestamp)的方式:通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。返回时间戳方式的函数主要有time(),clock()等。

  元组(struct_time)方式:struct_time元组共有9个元素,返回struct_time的函数主要有gmtime(),localtime(),strptime()。下面列出这种方式元组中的几个元素:

  1)time.localtime([secs]):将一个时间戳转换为当前时区的struct_time。secs参数未提供,则以当前时间为准。

  1. >>> time.localtime()
  2. time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=14, tm_min=14, tm_sec=50, tm_wday=3, tm_yday=125, tm_isdst=0)
  3. >>> time.localtime(1304575584.1361799)
  4. time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=14, tm_min=6, tm_sec=24, tm_wday=3, tm_yday=125, tm_isdst=0)

  2)time.gmtime([secs]):和localtime()方法类似,gmtime()方法是将一个时间戳转换为UTC时区(0时区)的struct_time。

  1. >>>time.gmtime()
  2. time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=6, tm_min=19, tm_sec=48, tm_wday=3, tm_yday=125, tm_isdst=0)

  3)time.time():返回当前时间的时间戳。

  1. >>> time.time()
  2. 1304575584.1361799

  4)time.mktime(t):将一个struct_time转化为时间戳。

  1. >>> time.mktime(time.localtime())
  2. 1304576839.0

  5)time.sleep(secs):线程推迟指定的时间运行。单位为秒。

  6)time.clock():这个需要注意,在不同的系统上含义不同。 在UNIX系统上,它返回的是“进程时间”,它是用秒表示的浮点数(时间戳)。而在WINDOWS中,第一次调用,返回的是进程运行的实际时间。而第二次 之后的调用是自第一次调用以后到现在的运行时间。(实际上是以WIN32上QueryPerformanceCounter()为基础,它比毫秒表示更为 精确)

  1. import time
  2. if __name__ == '__main__':
  3. time.sleep(1)
  4. print "clock1:%s" % time.clock()
  5. time.sleep(1)
  6. print "clock2:%s" % time.clock()
  7. time.sleep(1)
  8. print "clock3:%s" % time.clock()

  执行结果:

  1. clock1:3.35238137808e-006
  2. clock2:1.00004944763
  3. clock3:2.00012040636

  其中第一个clock()输出的是程序运行时间
  第二、三个clock()输出的都是与第一个clock的时间间隔

  7)time.asctime([t]):把一个表示时间的元组或者struct_time表示为这种形式:'Sun Jun 20 23:21:05 1993'。如果没有参数,将会将time.localtime()作为参数传入。

  1. >>> time.asctime()
  2. 'Thu May 5 14:55:43 2011'

  8)time.ctime([secs]):把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式。如果参数未给或者为None的时候,将会默认time.time()为参数。它的作用相当于time.asctime(time.localtime(secs))。

  1. >>> time.ctime()
  2. 'Thu May 5 14:58:09 2011'
  3. >>> time.ctime(time.time())
  4. 'Thu May 5 14:58:39 2011'
  5. >>> time.ctime(1304579615)
  6. 'Thu May 5 15:13:35 2011'

  9)time.strftime(format[, t]): 把一个代表时间的元组或者struct_time(如由time.localtime()和time.gmtime()返回)转化为格式化的时间字符串。 如果t未指定,将传入time.localtime()。如果元组中任何一个元素越界,ValueError的错误将会被抛出。

  1. >>> time.strftime("%Y-%m-%d %X", time.localtime())
  2. '2011-05-05 16:37:06'

  10)time.strptime(string[, format]):把一个格式化时间字符串转化为struct_time。实际上它和strftime()是逆操作。

  1. >>> time.strptime('2011-05-05 16:37:06', '%Y-%m-%d %X')
  2. time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=16, tm_min=37, tm_sec=6, tm_wday=3, tm_yday=125, tm_isdst=-1)

  在这个函数中,format默认为:"%a %b %d %H:%M:%S %Y"

  最后,我们来对time模块进行一个总结。根据之前描述,在Python中共有三种表达方式:1)timestamp 2)tuple或者struct_time 3)格式化字符串。

  时间转换关系

  aaarticlea/png;base64,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" alt="" width="328" height="344" />

  1. #_*_coding:utf-8_*_
  2. import time
  3. # print(time.clock()) #返回处理器时间,3.3开始已废弃 , 改成了time.process_time()测量处理器运算时间,不包括sleep时间,不稳定,mac上测不出来
  4. # print(time.altzone) #返回与utc时间的时间差,以秒计算\
  5. # print(time.asctime()) #返回时间格式"Fri Aug 19 11:14:16 2016",
  6. # print(time.localtime()) #返回本地时间 的struct time对象格式
  7. # print(time.gmtime(time.time()-800000)) #返回utc时间的struc时间对象格式 当你没插入值的时候,,默认传入你当前时间,返回标准时间第一时区
  8.  
  9. # print(time.asctime(time.localtime())) #返回时间格式"Fri Aug 19 11:14:16 2016",
  10. #print(time.ctime()) #返回Fri Aug 19 12:38:29 2016 格式, 同上
  11.  
  12. # 日期字符串 转成 时间戳
  13. # string_2_struct = time.strptime("2016/05/22","%Y/%m/%d") #将 日期字符串 转成 struct时间对象格式
  14. # print(string_2_struct)
  15. # struct_2_stamp = time.mktime(string_2_struct) #将struct时间对象转成时间戳
  16. # print(struct_2_stamp)
  17.  
  18. #将时间戳转为字符串格式
  19. # print(time.gmtime(time.time()-86640)) #将utc时间戳转换成struct_time格式
  20. # print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()) ) #将utc struct_time格式转成指定的字符串格式
  21.  
  22. #时间加减
  23. import datetime
  24. # print(datetime.datetime.now()) #返回 2016-08-19 12:47:03.941925
  25. #print(datetime.date.fromtimestamp(time.time()) ) # 时间戳直接转成日期格式 2016-08-19
  26. # print(datetime.datetime.now() ) 获取当前时间
  27. # print(datetime.datetime.now() + datetime.timedelta(3)) #当前时间+3天
  28. # print(datetime.datetime.now() + datetime.timedelta(-3)) #当前时间-3天
  29. # print(datetime.datetime.now() + datetime.timedelta(hours=3)) #当前时间+3小时
  30. # print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #当前时间+30分
  31. # c_time = datetime.datetime.now()
  32. # print(c_time.replace(minute=3,hour=2)) #时间替换
  33. ####################格式参照####################
  34. %a 本地(locale)简化星期名称
  35. %A 本地完整星期名称
  36. %b 本地简化月份名称
  37. %B 本地完整月份名称
  38. %c 本地相应的日期和时间表示
  39. %d 一个月中的第几天(01 - 31
  40. %H 一天中的第几个小时(24小时制,00 - 23
  41. %I 第几个小时(12小时制,01 - 12
  42. %j 一年中的第几天(001 - 366
  43. %m 月份(01 - 12
  44. %M 分钟数(00 - 59
  45. %p 本地am或者pm的相应符
  46. %S 秒(01 - 61
  47. %U 一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天之前的所有天数都放在第0周。
  48. %w 一个星期中的第几天(0 - 60是星期天)
  49. %W 和%U基本相同,不同的是%W以星期一为一个星期的开始。
  50. %x 本地相应日期
  51. %X 本地相应时间
  52. %y 去掉世纪的年份(00 - 99
  53. %Y 完整的年份
  54. %Z 时区的名字(如果不存在为空字符)
  55. %% ‘%’字符

  ##执行结果:

  1. 3.9473128470428115e-07
  2. -32400
  3. Tue Aug 23 15:21:55 2016
  4. time.struct_time(tm_year=2016, tm_mon=8, tm_mday=23, tm_hour=15, tm_min=21, tm_sec=55, tm_wday=1, tm_yday=236, tm_isdst=0)
  5. time.struct_time(tm_year=2016, tm_mon=8, tm_mday=14, tm_hour=1, tm_min=8, tm_sec=35, tm_wday=6, tm_yday=227, tm_isdst=0)
  6. Tue Aug 23 15:21:55 2016
  7. Tue Aug 23 15:21:55 2016
  8. time.struct_time(tm_year=2016, tm_mon=5, tm_mday=22, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=143, tm_isdst=-1)
  9. 1463846400.0
  10. time.struct_time(tm_year=2016, tm_mon=8, tm_mday=22, tm_hour=7, tm_min=17, tm_sec=55, tm_wday=0, tm_yday=235, tm_isdst=0)
  11. 2016-08-23 07:21:55
  12. 2016-08-23 15:21:55.438771
  13. 2016-08-23
  14. 2016-08-23 15:21:55.438771
  15. 2016-08-26 15:21:55.438771
  16. 2016-08-20 15:21:55.438771
  17. 2016-08-23 18:21:55.438771
  18. 2016-08-23 15:51:55.438771
  19. 2016-08-23 02:03:55.438771

执行结果:一一对应

  b、random模块

  1. #!/usr/bin/env python
  2. #_*_encoding: utf-8_*_
  3. import random
  4. print (random.random()) #0.6445010863311293
  5. #random.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0
  6. print (random.randint(1,7)) #
  7. #random.randint()的函数原型为:random.randint(a, b),用于生成一个指定范围内的整数。
  8. # 其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b
  9. print (random.randrange(1,10)) #
  10. #random.randrange的函数原型为:random.randrange([start], stop[, step]),
  11. # 从指定范围内,按指定基数递增的集合中 获取一个随机数。如:random.randrange(10, 100, 2),
  12. # 结果相当于从[10, 12, 14, 16, ... 96, 98]序列中获取一个随机数。
  13. # random.randrange(10, 100, 2)在结果上与 random.choice(range(10, 100, 2) 等效。
  14. print(random.choice('liukuni')) #i
  15. #random.choice从序列中获取一个随机元素。
  16. # 其函数原型为:random.choice(sequence)。参数sequence表示一个有序类型。
  17. # 这里要说明一下:sequence在python不是一种特定的类型,而是泛指一系列的类型。
  18. # list, tuple, 字符串都属于sequence。有关sequence可以查看python手册数据模型这一章。
  19. # 下面是使用choice的一些例子:
  20. print(random.choice("学习Python"))#学
  21. print(random.choice(["JGood","is","a","handsome","boy"])) #List
  22. print(random.choice(("Tuple","List","Dict"))) #List
  23. print(random.sample([1,2,3,4,5],3)) #[1, 2, 5]
  24. #random.sample的函数原型为:random.sample(sequence, k),从指定序列中随机获取指定长度的片断。sample函数不会修改原有序列。

  实际应用

  1. #!/usr/bin/env python
  2. # encoding: utf-8
  3. import random
  4. import string
  5. #随机整数:
  6. print( random.randint(0,99)) #
  7.  
  8. #随机选取0到100间的偶数:
  9. print(random.randrange(0, 101, 2)) #
  10.  
  11. #随机浮点数:
  12. print( random.random()) #0.2746445568079129
  13. print(random.uniform(1, 10)) #9.887001463194844
  14.  
  15. #随机字符:
  16. print(random.choice('abcdefg&#%^*f')) #f
  17.  
  18. #多个字符中选取特定数量的字符:
  19. print(random.sample('abcdefghij',3)) #['f', 'h', 'd']
  20.  
  21. #随机选取字符串:
  22. print( random.choice ( ['apple', 'pear', 'peach', 'orange', 'lemon'] )) #apple
  23. #洗牌#
  24. items = [1,2,3,4,5,6,7]
  25. print(items) #[1, 2, 3, 4, 5, 6, 7]
  26. random.shuffle(items)
  27. print(items) #[1, 4, 7, 2, 5, 3, 6]

  生产随机验证码

  1. import random
  2. checkcode = ''
  3. for i in range(4):
  4. current = random.randrange(0,4)
  5. if current != i:
  6. temp = chr(random.randint(65,90))
  7. else:
  8. temp = random.randint(0,9)
  9. checkcode += str(temp)
  10. print (checkcode)

  c、os模块

  提供对操作系统进行调用的接口

  1. os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
  2. os.chdir("dirname") 改变当前脚本工作目录;相当于shellcd
  3. os.curdir 返回当前目录: ('.')
  4. os.pardir 获取当前目录的父目录字符串名:('..')
  5. os.makedirs('dirname1/dirname2') 可生成多层递归目录
  6. os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
  7. os.mkdir('dirname') 生成单级目录;相当于shellmkdir dirname
  8. os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shellrmdir dirname
  9. os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
  10. os.remove() 删除一个文件
  11. os.rename("oldname","newname") 重命名文件/目录
  12. os.stat('path/filename') 获取文件/目录信息
  13. os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
  14. os.linesep 输出当前平台使用的行终止符,win下为"\r\n",Linux下为"\n"
  15. os.pathsep 输出用于分割文件路径的字符串
  16. os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
  17. os.system("bash command") 运行shell命令,直接显示
  18. os.environ 获取系统环境变量
  19. os.path.abspath(path) 返回path规范化的绝对路径
  20. os.path.split(path) path分割成目录和文件名二元组返回
  21. os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
  22. os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
  23. os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
  24. os.path.isabs(path) 如果path是绝对路径,返回True
  25. os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
  26. os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
  27. os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
  28. os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
  29. os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间

  d、sys模块

  1. sys.argv 命令行参数List,第一个元素是程序本身路径,读取参数
  2. sys.exit(n) 退出程序,正常退出时exit(0)
  3. sys.version 获取Python解释程序的版本信息
  4. sys.maxint 最大的Int
  5. sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
  6. sys.platform 返回操作系统平台名称
  7. sys.stdout.write('please:')
  8. val = sys.stdin.readline()[:-1]

   e、shutil

  高级的 文件、文件夹、压缩包 处理模块

  1、shutil.copyfileobj(fsrc, fdst[, length])
  将文件内容拷贝到另一个文件中,可以部分内容

   aaarticlea/png;base64,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" alt="" width="318" height="132" />

  2、shutil.copyfile(src, dst)
  拷贝文件

  aaarticlea/png;base64,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" alt="" width="316" height="44" />

  3、shutil.copymode(src, dst)
  仅拷贝权限。内容、组、用户均不变

  1. def copymode(src, dst):
  2. """Copy mode bits from src to dst"""
  3. if hasattr(os, 'chmod'):
  4. st = os.stat(src)
  5. mode = stat.S_IMODE(st.st_mode)
  6. os.chmod(dst, mode)

  4、shutil.copystat(src, dst)
  拷贝状态的信息,包括:mode bits, atime, mtime, flags(要求拷贝的文件必须存在)

  aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgcAAAAmCAIAAADfrK/WAAAgAElEQVR4nO2dd1xTV//Hb6ttn9pln7ZPbatPW22t1oFiVBQVUavWvXcdta7aVm1t685NAoSw9yaELXvIXjLCkE1YYQTITiBkkEEGyf39ASGDMBRs/T3N53X/0HvPvbn3cO55n+845wKQUUYZZZRRRqkF/N03YJRRRhll1AskIxWMMsooo4zSyEgFo4wyyiijNDJSwSijjDLKKI2MVDDqHyxa6cHIsE24vNx+uXxSF+LHPQr5uZarVOnuJhdswiXF8CZ+HZVCwYlIDPk2vLjS0GGFXJqXH7Y3vZExmZv9H5GcQmtAx8TcKGhuN3S4h9XulZ0Mr6Fw/+ob+38vIxWMetHFyrJBxFTT+Hr9NiMoIXo3DmeJy0nhsxJyYvaF4ixx8QE0kVA54Uu3pcyytQJAu68D43AsqVQ1/hmjqNvVB/muq99GHO6qNhuaYwHQ5gt/3CZcUix/ApdRKfu7y3Zag9OQDrCwCA+q3mGlWNJy3Q58xdbNIuKhN2386w3IxNXlCZY43M6ouAD60z3S6JIxe+rv4XCWuMjTKRWF3A73OJwlLux4clGecDKXlZCo1X/gcJa46B9zax4zm+1icZa48O8zn5SIDBWX9xZWJMFQqJn2bnvTC1M5eodF1Q25uzA2H7h4HcvEZ/aO//NCTkdQTrQlDncu50ne30MSXkFF7nkczhKX7NjYllFfdC0SZ4mLvl9FapMOlejMdXHDBhW2G6yRKZORCka90GJnoe+4h2XVsyVync6+riJylR1qOggC8HA/QuZad8wrCBAArc/WcHsmPuwfogK4Nbu9UaycOE1GSB7/EDkNAQIuiQlcmQYuzbEACAIguLuATp3AXQ0MyPMznd8GwelW1ofw5FYxBEGQckBOrEreEVFcMSBtKA+dBYKvWtseK6a0S9RnyfvrKxO+jYz2HcEJlXKAy26PyAychrL6NCDqVPn4ZBCLuInZOMvQqDOPW9iGCoj62GGPXN8HQQDELPBI8KyKn20FAiDiY88QtwmAajTxers8453/DYIA6Lg6MAlTHPWRFQiAyHmBsVimgfIcVgsm0u51EPzYO/h+fTdDCkEQJOZSHz5O/62ISOB2+D7ymQmCc3zDEI09TJn65nu7QvOiz2SVZI/ghEIq6mgv+znc/Q2M06KoHPf28clApxBsk3GWD9OdmpiCZ3/0IZFJxVcC7d4EQQDuczEt9Yd4v5lIEABRG1MqCtVDChGrJSvg+n23gOcKhklSQdbbWZdkH94wNTfzl6ibkBLmA4ZXGu3KF1/sLPTRM3/4l3YKdJEA9RFv+ju8jQQBuNOJoqJbWI9/o5AACFpm1BVzFfKJD/nVVPiuVtQ3MKlbzYhHTkeAgFd+s0rr5+k5i+BwAAQvNQ/+XzXQlb8Rh9sUnGzIdFDJ5O037eAAEvVmRHGbBIIGkVAZt8LZZhrSaXlQ3AmsFQCCLyNRc7xxG3FDmwU2cLmz9TQkaj7WABgglZzDqjnlBAcQqPe9wwPoSqGI5hcfNHy63rY+wO9LDAggUP92D4G39OlfbUDS3pq/1RYOgFYfugT+UpR3xsUWAMF3nb1+rmJS+p+1+uR91YTMDWg4AFp/5h1yLTfjkDMaAMFZHtjbBDZdOvIEMaE5fx8aDth77cxrZsggCILEXGp4ZvA8O/S79r6WONx6TxQAgjNsHRb4aZ5unZ/n53aoGRjH7SklWSMNCAU/vzxlPQYErDHrE4vyuNLW9sq7UaPW1Wov11k2IICyXRqVF8d85oeHIAiCJIywjLAF1iAAYsxjk39LiFyFsQZAcFF4WkCngKfQFBSxy6Nsf7Dyiqs1CO2p0DNTQcRsirlrsX4NbOPmzeiSqbylZ5CYXBFtdXLPhdtBZQZNRVFnSTjiuIWFhYWFhdmy+abbjqCzn1uVGjVFYmXBt/+IjC+nSPSZkJEZtACNfBkecLO2La86EWZvMx0EN2UQirnyp0ACBEGsQguM9fSnoALFNTRkU1CQxYhtiT34EggC1i4rtff7ubwNggAIfuQ5tGeDpz0Agi+B6K8CCp/oXlqlVLRWhs0CQQCBmObgNVQei13pZrcypSajJXc73Oota8TrNl5XK55874yYYePzW11XftfQltXShAy3P141csyqUki5xXmBAIh8zwnnyVYpFJIOmuZE3Y2URCg85gQHbBzmJ1Y2CxW6lxrgctvtQhzeANFzPBK924jB2dj3J48ESM5g1t/D2s8A7RYGpAa0ENxS/N4dQkK3ISRAEh4Zm+o7EwQBK/R/3HwH62qdn5dpAO5cYYVXTswqBOp1lM2CwIdXM5I22dksxCY4NGkeM7o08+fEWGeSZMSFlUJmA/KhOwCi18TkZwmUQhG3gTpaXRF9sqPNMCDgEvR9aTuj30ADonbVoBJ12smlgroyA2aFpK4u+7A7+lW4266U0tiGwovBrm8YQsJgdfEI4dY//Aj6Pi+D4ZmpoOjvoz156PPT+v8sMPu7qSDuKPC9Yvr6K7PXnHAsNISFAXEvpbm8oKCgIA2HvrBp+WojFV54sbIebNt7BVdJFeq/bYySbZ52r4IBN+s6O3ob/sC6vIN0PoVvKOc/jZUwKE7pLoz1K4apwE9IDd2CC9oQX9UiH1BjSdJOJhd2dRWM2OxDhzxIoZ1a+2uTBm2FPYU6hR93FOxBOJyq07YXVHI56Z6T1XSU9cGirjxSGzIIPg1lvTKlrpBMIQj6RZK603D4q9a2J0qYNImwtiBoGhJjEpyepO5ilMqB7h5qQ58hR5VqoF/ILugil9DYTP0uRk+Knt7mm25wwNbFJLtD/6BMQKhO+MQKPccjKYhKr2nN3+mAnuUaYt3CpBjquycqCedxSfQsK7uFAemRNGoRIXOzne3nPlFO7UN+oRESN7YUHrFDfeId/HtlV3z54+Ne4DtugecKm0oY7C5xb2lt+kY4fI5PhE1zL41JdIz1fgvjeTSrukI8dL60X0ju7aZIDA0EFBIah1HQRa3tEfDHGSiIy6szdjrAAc+oOw3d+gf7WSml6Ts9nNdHJtrWdRV0dYXnJ2x2Ad+yd1kcWxBK1iUDrxWd4D8T6bYzpbyA1R6UFfG1jf26uNxoet8IJEAQBEFyHiEM/t2Fe555z4ULk/Igiel1YZfNnhcVJPS2uuwEvH4UyYAGOHWJyL2z31m07beoNtmYRQX1ydZH1xipMKY4xYk5da20kSOpSag7LzK9kdoz0c6DlQXftng/IruJo2cnQIygCJ8PXWPs6skU+UB1CW6Rrct3+BaCSKEwhISasug9oUEbgkbZ/Fz/jUS8BIIfugeYY/WO+n2BRrwMgoC1s2lcZYtiYGziGPYgdRes0fEgDUmlErd2kWu14udKpSI/130WAjUjvLhdAg0oZMUZzi8hkLM8ExP4kELRn53j/jHKZk16A0kCQSoFv6dkKxycYet6v3OCNTpBjUEFGZNdc83DbW5wbgqTR+czcfHOc11DbVp6uschzdiSdJDLzrt7LntYmM0WUHo6XKKcv/aJdiX1cka5bG93u2O040x7r515zUwZxGO12Ebav2Lt/E1SWZkY6mER0Q8dP3PD/lRBYckgSMHJeZKwDI5cFJrycIrf+bGoQCOVXg1Ev2bre7aI2CmHIAiSiHlZxfGbXEDAxv7bjCoti4GXX5y80S3oRE5dlUDS0lpwzs9lU2x+AnOsvAk5r9DtwoGf74VXPYeObFJU6Gc2xFzb/Lyo0FNfnOjyIGkimRMDEh6NWFFa3Ujmjg0FIxUmonosiE0vaptUQom+qt2u+xUQJkoagt9u03WnA8tGGgpQP5lBK6FzuQqlCoL4XPoTCr1TYhgJEATxubRSCrmQbGCLSvOdaY0cjAYDIAgE5Sa3dxgoSUiBYZLSpYoxB448Pyxy2oSpoC+Vsp+U+7U96vXw4mLOYDxB0d32aCEcfM3a8Xa7gt+avcDB6p3IknrBIEhUAwMiIrkzp63yQXjwjsiSqrGr8yk0BhWUUpmgiUKr6hFKIUihkNLYlHLGJJEAQdCAWMJroNDresUyCJLLJGQWpYrF5YxW3eLuTHzMHDevTdkNzX0yCIIGRIyEvNDZcMQCXFIoiZVcEPWJu8/ux83kIVNAIRBy68it0eW5l0NifsMTSZO8X61bGZ0K/NzixPXWIID0OVtI7FTvldBrfg13AUDwrYBHbqRhLMh7eN1VVHanSKqAILGI20SnNfLGTaUTl3md23/wB9fsqTcXXlwqcJsy/eGH/pgQFSYuIxXGV0vY+Uto//wppUKj776TmNjaCVKB4PHNV+aXQmrookmkBY0jmpOf41uIISQscHaebhfmzzSUnCoX1FM4HKVqTFuh29UHOc01KZTOE2vvlvNru7oKyeS2sZ5bpVCQrD0c/hWOH0ICBEGQUiysOoa0WpVGaOS1ITyd3o4sKe0dPKqSSlm4eOx6LHZtgPen1ojpNu6WJWNl/yhk4qqKRwezmgzl8uiXHcuD9PdLTGzDn/IJsMyqH0QCBEGQkldck7rDNeDH8qY8QsExX+y23MYW4eBRWQe5FozCrscGmHo6f4Cyetc3Ft4yVpqqsIfkX5hrVUebwCSTMaggr6vL3u8KAqDTrvTqyuGIS1+7a2LAByAIeMfbECfgBRn758u8zu3YfdYxvWWqsfCXUUHKJjdkRD3WN7T6mR2EzJiCHr3dEnpdzL3tJus2T5QKnKascM8/A0vHy0t+0anQ9fhxaXn53zhHiVPse3HbXNhl9ymkQnee41Hzj1b9GjFBKhDct341a49DaRfvuUGB0RC/2Bb1stpQOJScvMwKMzethavvsJqg5HQmBc/gj/Z4KhU3Mj5wHRa7ISi/TP/YQD8pdTYq3IWjfbZKqRS1USj1ArlSKWoitdvEeKzDYtdhseuwgWsDvP9rDQIgCCCtZ3oleueGve+Zq2UuKMUSun9coLo81jzAf7GTzWv2PrvGB8OLTQUxMzk/YUNobnKftk9goE/EbWZ0kyXSPhE3r7r4l0hv9bMHmHo4f4ACARAE0O6WYTEXY6P3ZtRrmQvS9o6quw81dWXm4z7HHvMf7xj4+GAYy4PUL+a3MMhFZFoDV9g33KZ6mxGx3q+C4IdBqf6dk36/xE8GsZAx1VgYnQri7vb4u+bD2rxv38/+D/2ts1iaIhoqyDjtuc7fDRX95vB5+9zhTlfKbsl0PGm+BrZ+x/6bsTTNuY2pdifNzWDrdx2+Ha/u+nmk4sBfzc3NzVYsmffh69NnzPxk4Ur1HRy6fCehRecWOc053r8MHlxpMt/Ecjc8bbxGP9VU6GvO8Pj9gPoW912zTySMMluJUuQPPzdcnQduuqc1aUWc+LVxtj/vNTc3/erAn15ZHV15brdPq8tesouu1HouXmUE4vJu9cErTgk1LAjiVoQ+uLhraN+RByHFHboNpT0V9csxzV/zKAJ5/8HDonLy8Mi2Nen+j4fNzc1XLpw9843pr/9n7mJTM3XpGwGFbfqJvD0FbldPbDPX0s3g8k7dZ2+M/On0HnNzc9hXs97817QZH81ftnKNuvSfkfW0EWmPg2LFXlny32VXo5tZUxrZ0BbVyc/pLQQIODsvQCCmg+B3FUzPCMxbDm7wln7JBLhAq0uyDMKaBwZOePP5zBoEQPAlhMPxWr3eRqUUc0qovbyh/yhaq+L0Tl8b4L/ECX20mIKn6G3UJyx+n4hTRuNqVb1qYKCfzFCX6WiJyQoEQBBAoD/xyimFIAiC+iX8pKxAy/DoB816CTEvNhUGZD08DqGnb7Bxi3nUqLyHenW10st9dVDYneoRdUVjEXt5VC6nsVeoZc8pRWJ+M11dprH0RoQ7AIIA0vNgZn0bBEEQxKA22CYG7kkpjKXrtccxo82GRGkpPOtnBYBu+7Jra6STH/LQ0pCH1x/6Nahkah0qo1BB3E2KB7fv+dElDj+ozPjgW1vfmbNszXqHCk2xQSp8/uVFlNOVfQeRoXg8Ho/PSwyzPbPF8pQaDEqpqJuUH+F2+dsv1/ysoYJSKmS354U5Xdi+YP2NYSrIxVxKIx6Px+Mf4WzPbZkLO2mbNHQL+EpCM1O3q5MJe7oa8Hg8PivC+edty0z/Yir0NWd43ti6ds/Zu16peDwej49y++PcroN3/IsoI37U6cZ2i8M/Wvul4fF4PD7V++65PWu/ue6e3jTUM8oFjLb6WKsTFl+Ybdq558jPP/zp/jADj8fj8Snu987u33DWPkZNBjmf1kKIAvev/ezjjedtEghMgRSC5DwasS7y/u4D5y5iQgqIVK5Y45dtT7W6duUKGBCXNVSTuFt7ti1///1DVjGaUJWIRSRU4vF4PB77+8Ylq3fccH+Yra75BnKvSCu1pafQ/acTltsu24Qk5KiL4BOtL+3a/p1NWjNLE1Duo9fXlOPxeDze7+qyubCDIC4xV12+id7XP4pHmhJ+dtHsw/bPz1SoKglaaIN8Ge58vuDRBhurwRwkSlvGOjTqo5An9VLFuL/bL2CV6HfQFDyF4hiKeBkEAdekCDJZ5xC57idXOAAiprk9ShPopwkplQMFeWoABAaYumJgqYTBEws62lE4OICwessnHa/TKQ2IJK2Y0JHzn0dILuqojABA5Dt2gXAibxACIiHHLxz+MtLqfVdf3V41YJWvxydW4AtKBQjidHf4pAzdrZmP5zL/oHNFzYN1lVjx+IQXCNi4bU2rbtaJLwoJLSWY9KL0cX023Ha3ZF8ARJuEZoTTRYP13dlacsEH/irafq6nv25d+Zu4Ob6LAidGhX5CU/GlAKf3rVy/ffTksUAyudkNg2LnYI6vsThhm9I0tcaCISrI+eTHPmfMruBau9Vv+IBURC6NtL1gueRKrMZY6Gc2xFwzfffTtZf88moIQ0M/pYxZk3Brz/yNt9I0HS+HmIc+oUMFCIIgqKcxw+q4NhU0YtcmwY8tnqAHqY+Y5XRqzV9LBXpZ0O29FgfPO6S1MwWD/Vt/ffS9Q7CFB+481DYYBPXxiBNHjl51y+pg9w0WVPSxSOmOFw5Z7LkVVKZ5QEauw5l1n3/57SX7hHJyj2iwrFzAyHY5uWPNnruhWhaDuDX6/t6Vh64HFmtOJ8X99sDBI7VZrBOo6y3zOH/9lmN8LW84EU/Ebi3w/N78wK8eeW06bnAIgiCo2ueg+fazY3iQ6nwPmX023fJeYi1L033KOKn3N6zY/Xt0raFswjL7DYu3/DRBD1KFw/r5/znsVk2Z/HRRQ6KWbHS3mY4AF8RV15OLvh3OTO3vC4myfRPtuDS7lf+MfiQoPQ7xMgIEvPKJulEIlYrt4AUHQMQ0n8K2EWepVKpeDqWYMrSVUKmNQw0Fksv7o6PgANL6ncBi7TCpXCZJz3T9EIn82Cd0d/GYZBiiAuo9pzCs2sE6SAUAZfsxNiuOovnpYkpnWkPRCSfk+y6htpPKNn1eksvEZLbmhsuZmgRTOrnu9wA4YOuzL5eo5dGAuplNqEiHD9H2X4ano8f25g9RAbM+ruixuvkPUgGw9d6VVpamU1dtATkxazG2sJiCR72jzlwXMJsc08LXBvotcXWYiXT99tGT/KlBAjREhTWHUaM6KJ5Rhqgg47SnIHYs+CFap4tVygXt5fFW98M1A+F+ZkPMtQ1zTW8m9WijmdtWaH9yLuxKlKax/s9Roa85yer4Jovj6OQOTUcnqAr/Y8+8JYdvxTYOD4MF9fGIE1u2XXLO6NJtCpKOR5iTGzcdRyWo7QWop9D9/MZvDj2IIYh0htGSSv9L20y23PAv1jyenI/3PL374HmXLHXvTYpzdA2LKWHoZWGxMpD7z9x0ytT1Pcp5tViHgNQS4kgvzrhUEDGbCVUlTVSeWOdVKHf5Zvk3l3FaXimNnooKbYFHvv745HOiAtUT6/42EgEE5eaxxYoenfkK/M5McxvUNIzb6XKWaJxMVMN6NiqMoSEqgIhpaOflAQFr1Ntqf7/FzpgTeFJKXth7nrkGl9JTX2IMKtjNjajo0r1ThULSxaRWMjmTTi76qzVEBaT1vx09YFp1tcLTdTUu4j6+/HZc9O50wlg5SGNQwS7wfAlJN/6pFIp4zXR6o3bkYIQUUmFHN72ESi2pLzwb7PWBs/vy8HRXImsqGvdfSQWVhFX/8OqS9013ngqs1dqvlEtF3TQtAIwSbf4HUKGvPhY8sn7jaftMita7oxB2dzVXE9oo3GEACGrC/9y7bssF9zy6/kumoGY5nLFcf+hBLGGoa+4pdD+/8cAP9ln6pjsjC31izWdbbgRoYQGStEbfO7Lx9N2wChYEQRApztE3KrGiWz+jT06KvXXQ0mTBOec0HTNXzmNzBEIDE3mqfQ6abzvnMcFoc1PU9TN7zMzMzMwWf/rOG8umggqU8LOLZlveTm/rGSfN+OlVWYz9Go182TnOl8brV6r0Z7EphDkZvm9bId509IK3Svuf3mCYHBVUCkVPSKy/WUDA8Lba3+9LDAiA4KvW6OMl1FKqZntCZ5AlSrmot4LBG6uLeToq/H+RjEwlICJ16srU0+1jGxAAwTm+YfdqdeqqtofbLZGyeb3NXJGB5jmsp6PCU0ohoXCImATcfCT6o9DMwK7J9+TsHMzxNXsue+Z1TG65Fn0ZjCuoFP285pyw29/OmL3IzMzMbNvB09g6A+X+uVQg5zpfXGe6/7eH9eMMqDrSbc6shh29F988sqCiIer3A6bmF5xyyIM7RqWCvC7kxx0L1l52y9N+heV8vMfpXQfOO2e1CSFSnJNBKECQnEdrSUDs2LRq3mJTMzMzs6vu6Y1jte5xbQUIgqCm6Btn95qZmZktPv6Hf2x6aWlpKfb6qvkWU0EFWd795XNnH/ero07pjAmI3pC2ztV6OhgEJ7GHMk1HzG2W9nV7PUS/gQI/cPNbld0mHD/EoKNnpoJKOdBWGbva33ueredvDZruDN9JssbBAYTV2z4ZxQb9DgMyTku2WQB2c1haosF+5n+OCmIeLSo3wsTD0zwozpGoqatHlfknveCAjdu2tBqiwQGFkJFUnGTmH/pDTnW5QTg8VypAEATJO5sLT/nYAtbux/IamibrSCJGXdu97fCDmOoJLAn7NBo1B2lAJma1lpUVZcTYn1zw2ozZX6/euPsYKkPbX/cPpkJHJub71SaH/4wjjlOwNRk8uWLFKfCRob6gJf72kWWrztlmDBm1o1IBanr4y57F+lSAIEm597kdu0/bpxPrRoUCBEEQJO4mNdeWlaW5XNiw4L8fzVu0fPUheMSTLoNvxrhU6Ml3vbJr8cwtPzlHZJSVEWl8iQKCptCDBPWl/2by2Td3ptRYoDekbfbEvIIIgrfQ6QPq5VENrXjB5zbd9rH+FwIEMK4rfGNw3U+xttKz2woqlVjAKqPRyulsltYAYrS4glIhrS+PWe3vv9rPb7krBgDBaUj011hDwef/OSoMKKTMXmYZjV7fw+dpNfjR4gqi3i5cdsRqf//VPh6f29sAIPJNjNP2FEPB5+dOBUjBqvsj0h0AkQsic2MYk8MCKf73fTsP3o4Y9bV/Vo03X0Gl6OdR6p88wWfEOJ5dMmfNAWSGXrT5H0mFnlLsje2rt17xKx0np5ld6HVls9muX4MrRxr5/LKAq9tWb7seWDrk2RmVCly8+znLVbtuRVToNWRJW/S9Ixbf3UXe+XMsKKgl59NaG6qfPElzubDFfOk3f4YaAsM4VOjOdzi65pOFB+/EVjAl2gbQ1FEBEqb/ZvL1LjCTxJkaLAwhwTXet43JGtBaMVuPCnzCtWDsGn/vz7zcFiPAaSAIgFazPX1h/v7IdrlsAmbDVMcVVFIZ08EXDoCIaTbOJv7+q9TbSj/fpa4O6zIan9Bow1sFw9ASdTpUUPYJqV7RQRaBKRfGpoJM2FqftTM6J32U9OEXT7LWttKzrnAAaf2uo/tyrbpa4eW2NCD0Skmrdl0RODzOyAixDhWkxLYnN8OiD4aEbBqbCvyuoLzUn4oa6jStu7++qfiXUL9VfrEPqjp1SN3dcCfKEwDB/4ZkhFDG8maNK1L8zX07D9yOKJ9qKBiigriblu/1QK9/Vcn72bUpDlc2r76ePIyFv5gKvURicZzB0flfTgVFa4r16dUrjt1PHvkZKEE9vrioYGjlMwUtz+3Clj1nbTI6RxQkPYKf2LX9qk8hY6hzHZUKrXE395usPe+Y1T4iaiDAe5zetfrDrT/75RINrfbVlhKYnK8/e0HOp5X4Xd5y7E/vfNKIhmkgrtAcG1vc2jo4ZaHO95DZZ/OOueS28nW7yaekAiEkpJg22pQFYbXDQZOl10IaGJNPuaM3pG3xxLyCy00ufmSBC1yp1V+s8naeiUS8BILvu/qs8PNf5e38jlsirubRKgzaLDH/Jw+r1xAgAHf52gW0LGKJJxB/1qYCpTpW80P+Xv+1BkfNQVIOtFXGrNK+MfUG8/WcbQUCCKs3vdPjtTq1JzRaOZ3RIlRAECSTidNzgran1hseQGmoEOJKprhHeH7tjL1VTXIYkwpycW9Gpt8n7tFhz7rivIBcFfzrKssD5+xypnLCqJhHjcqNMFRXvkvcnd5DgYCNu0VicbpuXVWze+n9AxAEsehEx/SEO1WjfKBNQ4Ucn5qyH/09NkVmoQtzT41JBQGt5o8wny3JZcXDjbWfHpEV/iUSBEDHXelVlVqo5pMrfgp2BEBweUzBo+7JpF6T4m/uO3sBk6KXczgVMkCF/m7SI6sD33jW6O1X8jpLvC4tPqdJQpo4FURd5QEXN5ju9NC+aD+jNurWuk8NU6Gv9bHbWcu1R/0J6j2c+upsrE+hIbxOGRWYldG2P6xcefRX+8yxk7Wl1Fyvy1stdt8MrdG1FgQNCVHhQUl16jWIFcLqsJvHzDf/4lGka9zza8P/3HPg1N2ouuGEo55C9/MbNxy4G1Wr01l2ZFmdW/P1t9cCCukGhs6Stuh7e07/7pJleF1A6iPUOYRrTI1+PrW83OvI9/edskYmIfMx6UMAAAqDSURBVJHjbmxZcRxMqhs+pTnYM6GiljY4tKp037Xyv//ag85s0rNbhqnQlRueSuhiaY9aSaFnVyw841JMGq4sgicmrpHUM1qDlnESbiw2OWCT3TneylZjip+UFrbOFb0koTyDKZRJeLVMRjmdrtmaMtahraaD4I7H7fkUejmdXs4WiGR9RAajSSBmdDMq6fRyOruRTW/qk+l/fdOQtKnQ38cup9PL6Q3XXeGDM6hfQiCWZY4YzauU0vbsJc62sLRGnXuj08vp9FJyBzrYgAdJW9L+vrBomw+Dyww32SEqIKaj0HPc3b90cr5UxenijeNBkoo4yanuH7gG2FEMHR5fAlKx5/GZwLTXPlyx12rKuCBmZ+Kjl/gFfY9vHVlXaVUFp7wMeJC0Rems+iXU92h+q+E7GqIC8i2MwxwnB1hwvDtJSCCO40HqJVf9GuK0MvZxyvAboWTH50YtBUEAE3CxpJ2u6fx5OfjEdTZIAON/sbSNMoksL2657+XTF+4FF+vnHE6FDFBBxiGl3F75+lzzgw9SNZ2sjNuVizm93uK3pN7h2xB0VXge+dQgFfZ9vGSbq2YSvrKvo8jr+0XzNp9Wf6Gnn9GQE3Tl6KUTG/715ofztn73y8MmnYsoec1ZDt+tWXHIdnA5DA6xLMnXOq7JoM01VVRglgT+tuVNAHh93tafAsb+Ls+AqDPT9cqOJSu+Q8QMT1al4gPv3rlkFV/F03r1pbymRJtzO5bv+TNgGAzkx56/712974prSgtfkxXeU+h+fuNnM2fNPQKGPRkCZWeW49Vv/rPh1J3ICq7hQYGiJsgjKnUUKECsDNT+TYs//+Z3nenOnGLfS9uO/haURxq5Kry8PfLaplVbr+PKqBIIgqDmGFvfhMet6oxscYP/xTWfz/74jHvB8NeqGiOuntyxcM7bM0wu48rJxR5OyQ1EnXGQrDng9LKlOx4kNQ1OgSEE3/ZIraSN9U0DISPiOmzF7yGNzGc1F/hJabilGLdLFW3lPKnc4DpGHRlzba1emoqv7gzKkAdJwWLTXULhAIiYFlYy4osFEASplBJuJWNo4K+n0eIK2pL294U9tHrfNRNv8PAQFUAABAFru08TqmjS8eMKQgHbPxL1pqPnxdpnS6FU8Nvz3Q7PBYC3v1h9NWYS32jT0YCMK+ip6ebQDH3MYLS4grYonVW/BLjtTK01HBAcogIIgCDgjP2+rJMrHz+u0NWCP++L/Cw4FUseNoUVfErV9VBXAIm2SC59PNg/SBjxhfFrHGxnwN12pVeVimXPDgVueeAvFy7fCS6gGlwNfLIyQAWVgFrpffYj8x/h17cuhallarZp63mX7CbGkF9BSG+IuL5k4ZyZ0//1xmzT3SesM1kQBEm72zLtDi7+avbMV15/a/a6oxdD6weLK2Vi2pNom+9M5iwcvN6GXcfuRaalpwTeOWGXVlHX1MrWe/mVUiExy+fnrbO+MIHBYLBvj132z6fxdFyBPU1ZHldgMBhs+eL5c957c8bMj780gcFgsP2XHyS1ahcUkYpwd/bBYDDY8kVffPLvN99495P5JjAYDLb13J3gck0AX9aa5nDWBADeW3kElUIe5482IOJQ29J8bn+/Y8GyoUradPIXx6RqGk9vOKgQ9pBbHvn8cW7XkqGCi/dcuOef1krl6ExM6Cl0P79x695rVvaYq8csh0rO3fL9Pa+8LnbfaGOC9viw5McFo60gLq/0O/XdjyfPHN+/d93y4b+myabzIDa3RWfKsuYUHi0ZuXuT2VdLlsNgMNj3qLDiDqFmfr6cRyXG3DJfY/rlIvVz/4AOSSmoSMMcW71iycKl268HlnbqrQsv45Kjfl+3ZuXXS01hMBjskkNyNV3/Yzr6EjJyMWctfnB7TOFO/JubWlL0cFg1DDZdOjCq72fqvsU2qNHiCnwuvYJOr+Q+dXRxAlRQisVUtA9ypn14sKEcpH4xPyYeDYAggETPCsrNFEghCJKKeY8eOQMI64884uMMdPsyRnf1OTT8ZaTVvMDoZ/vgs1Im5hBSfX4+tNjCpug5jGdHagJUkDYRi0662K2LKco3NLxkdFXdwFoDIAjYeu3MqquTyCEI6qHU/B5iByCdtqWUlxuIi/HzSpI2WMFftbHbmvqkYNgYVvTTuWRsdvRmN8cvvPxgfn4wH/dP7Wzm+MeC1ZROYf8kpghyy7G/3Lljn1DNey5MMBxtHpBLOJT6NkY3talSo2pCY6fGTIAGZCJ2u/pYDaGpiyuDIEgpl/RSGtW76xpbWJq+XikTc8jDx2oaiBSepF/EZVJ5o73zCgmP3jpUvp7Y3q3/h5SLubTWypGqb+nk6K4OIOEzO+oNlKwjdjD7tPovWV83mVhZWUfsZPVNiORSAbOzefhyhFZyj6ERHwRBkJRP79DUZ3Mnkz+iXajjCmkEdldLnbookTw6ESAIai9Ix1dWM0ctIeF0khlUSkdrc63Wgzd0sgSGxltDEneTiOr6aqXzJPrPJGa3NRM0V2tjCvoVkJxHITbUVFY2kjliA6FZEYvYqH6odpZQOoEGLevtDP/T4rx3LnnUNjI5/VVUeGapZ7Eh37APDzOY2aCU99IKN6HAaUi7pTh8xcjjSml7V842OHKmQ5B1p2iwnagU4pb6xK/g4HSU7Wdevit89TafJZ5O74IgAIJvPbu5AEnptVHWJ9c/yH2+355Xa4gKCPu1MYUFBn9S2p1RHLsEiXjD1v/s4+aRIUGZlBn3+KEJHL08Iju2WzrY6gf6urBpQR/BkW9hnOZ7j6wrry8cMW+AIACCn4WkYinaHY9SJOa3shiVDM1G4Ag4E8lbGF2kDKv74K3Qgg7hc2PtJL/bbNRUqi3x7hHT9YYyU/VESre9dsj0e9uYqsYnBUVVtR3PaczwAkjIbI5Dbb/ql095HmBQU2HdYzrvqT/kZkBDVEAl5oy98PaEpVLKacSkRXDwZYTNHE9fU98Rm4/PUnf7GSAIgKhRzAWVYkDcwWDWsbW+Y6NSyqSCZgajarytht3d9WzhTAG53O/ON7uR8fpegOcluZAWkxM8B46YgXb4wstQXXl7zHO0fQ0EAdBuXaxBc2GgT8RvYbBaeFrTlZVybl9v/QTqqp7D75lcjz+uSOm2COu7uPzW52UmQBBkpMKLIl51FOqixdwPZ77+xnuffLHoDDKsbAy7nZ5pfczsvTc/mDN/8xXHR3Xdf4mB/rdJyGwisfjS0T6sMxkNUgGXX8KRPNMKF/pKj0OYpDRU0LlTtwKBakDeR5xAl1TFYNayentejGUqpGximsuV/dcD80d4hp+jVAqBkNswobpiEcdcpuKFVT+XQmUwnisSICMVXhQphD3ktvpqtVrG9hop+thdLfXV1dXVjR1M/v+uofDcJRXUs5jVXIliiob2Ah7TYND4nyalXMKlk1pGdw4b9SLLSAWjjDLKKKM0MlLBKKOMMsoojYxUMMooo4wySiMjFYwyyiijjNLISAWjjDLKKKM0MlLBKKOMmmKpVKq+vj4KhaJQKPT+LRAIqFTq4L8VCmO+1osoIxWMMsqoqdTAwACPx6NQKGw2m0ajaf+by+Vq/5vFGm29IqP+Tv0f9HbKBjOVu0QAAAAASUVORK5CYII=" alt="" width="333" height="24" />

  修改了修改时间,和访问时间

  5、shutil.copy(src, dst)
  拷贝文件和权限

  1. def copy(src, dst):
  2. """Copy data and mode bits ("cp src dst").
  3.  
  4. The destination may be a directory.
  5.  
  6. """
  7. if os.path.isdir(dst):
  8. dst = os.path.join(dst, os.path.basename(src))
  9. copyfile(src, dst)
  10. copymode(src, dst)

  6、shutil.copy2(src, dst)
  拷贝文件和状态信息

  1. def copy2(src, dst):
  2. """Copy data and all stat info ("cp -p src dst").
  3.  
  4. The destination may be a directory.
  5.  
  6. """
  7. if os.path.isdir(dst):
  8. dst = os.path.join(dst, os.path.basename(src))
  9. copyfile(src, dst)
  10. copystat(src, dst)

  7、shutil.ignore_patterns(*patterns)
       shutil.copytree(src, dst, symlinks=False, ignore=None)
  递归的去拷贝文件

  例如:copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))

  aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAkAAAAAjCAIAAADzByK8AAAfdUlEQVR4nO2dd1wUV/f/ZxH5GR990vSbx15j14jRCKiJvXeNLfYuBk1sicFk72wDlia9izTpvYgU6b33uvRepcPuzszvj91lCwussgZI5vPav+4c7p6duTPvOeeee4EwXLhw4cKFaxwKGm0HcOHChQsXrg8RDjBcuHDhwjUuhQMMFy5cuHCNS+EAw4ULFy5c41I4wHDhwoUL17gUDjBcuHDhwjUuhQMM1zhTheONiwbhjKY+4eZSqpn+LBptCtXZuqnCzMVwvgZtCtUUMNresUfHz9ET611H+jUqdQqNPk8/wL+zlGxKnUJTn63naNM8km57q+oSfqJSp9B01lgF+zTm/W5CnUKjLzP3cmmVlue4Pqpq7Xzs19JoU6gv/8jKtQlz2aJNm0I1uB5XXNjLtciwvqRMMw4v6hhVP99DOMBwjSdVON44rxuYW9uNoELtMaEmC9QBAQCI6GCe5DFfR40AAATgs0nNDcxR8nWU1NvT4ehKkgUAAtRpGm62ac4TYQABMFXzuSrjw7ttf1dn4sjpVn2xnrtBnAOn2+n6Fupl0vMe10dTVor3Hn1YBgCIaPko0GPXSz0ZACAA73iTldjGtUFYvYmmZ25RjMYLw6QLsJ663CgLZa14qXb6cVUVa01XvaAV2jDajuAaVhWON9Ye/NMjv65HmF5YS8pFffpkACCi/sPcpHv6Op8BAAFwMr6uqhdFxXc2XoWwelPCzCara872LxJ3uK+pLFQBJkKA9F+6JbUo+QIJhgCYQtd9VMBifvC5YHUW571eBxMhQJlpYEPKjDlJgiEApumZwcUj6BaX9NRQHHXphc7kF6+tSt+JOdxeSHM2+woAiKh9KvztY0frJTCAAPghIC26FRF8HURY5d7PDj7RdU+r+9t8/3BJC2DvypIMT0+e/MmkOauU1GKl1OmHqqMg1ODq6jlKJylvxF6D9tzXWpdWTZ48efLkyZ9MkpuldEotuP7vdhLXe6rC8foaFfPEklZRJLU4uBjMpACIaGdY25KR5LSYTiEAcDK+rrLnn0YvDEO6erKuwQAi0770KRRztKucYgLLAMoXWr6+nW3hwcayAPyHrjMiemGsxub8341gGaC+wCTodWudR4DhBJxeY0t1jv72K2EAmfuZlQxM6baHhDsraMAEosW9ZEZ8XugxUw0CAD8EpEYJ0wvDMAxD2RVefxw4+8Q4onjMh2HSAhiKIqyG3Aj6of9bpjDaAOsoCH5+cSmBMP3bI3CgWIIhbFZfT3d3d3ddkis4obARB9iYV4XjtTX7VT3y63tEj5SGfKOrTiDaGdS2vmtOPq9Pn0zUf5zXWM/859ELYzF73N1IE8AgAGP11KW7TIQpX2j5BvZ115WFKMCkzzRtjOtHhpnetsyEV7JAfYFx0Nuetvy8gHUwZZah88tGFuufd4rHp3LS/Q8ZwAQwCMBqU67b6skAi3spJWVt+RQns6+A9pmI3IyugfTCMAzDUHal19N9px8bRxR3fnznRyJpphB7arJd7m/7WADrLMmIdjLzrZHAtC3vjfa5xV+uO/SXX83Qd1hblg/1tOK/EmB1QTZu4Yn57aPth0SqcLy+Zs55veSyNtHrWUox0f1C38+7ob0bxaKCjebS9B/nNTWysOEerYxnetpfmoREd/ayPpbXwwtB8u6QKVMto4slsma2ZrlxZp7EAYzd1pF+hUKbbh2Tx0K6utsdnMmf018a17PZI8JMb1Vd/Bmq1lKnxCI28q611siBOtvA+WXjCLsdm2qNTPbfrmV1Kap4VOcUGjxDXDbovlLNqJKoPqYu/WcHAxnOwBADsFo7b9tlOo6UnOpmFM1M9tr1XOdMRF5W91BveCiSbHxyy60/PcZ4IlGqAKvNdr2/42MBrD4j0kXzN+9qSWxRhMXs7e3rY4l/v+DrXwywTGuSlVdg7rgAWKzahq+3/eKRNzD8wlAWm9XL5r5IIgi7l8VmoRLEXs0JxzTV5AyCIkcTYCi7PkKRCCaaRoqbzhIR0t2bdZ0EIDAYwDAMQ5gsVi+bO+rZbFYvSwqYQVHBblE2m9XL/kfSC8N6ajzevlqoYX4uomg0HwidJYZeVjO17H5Lq2wZ3rrOKcBhFcwbGGIAhrJ59wWGYSjC7mOzmMiw9wiSbHxi876rYzwIGzcAq8/w0Xu064lkAJNY/16AZb68dAtojQ+AxdLWL972q2d+fe/wthKqNMFuphoZMhxVgKFofoSJDIAlARiL2evuBn9CpV5LSztPJA4CMFwj0ruaHJKjDkHDYnQB1lQSd+OFJkHLXhKA5aYHHDaAN/v4XLO1XTZYCvGDhCYbH9+09+rYLkgcLYB1V+bH2+t5VIk0d5XlxL4y9BKlVGdJjNmNldNX75AUYDVJjtq/HSeJnwET0FgHWL67e2BwcKm0u60Lop7Y+NWSnzSHBViaxZmtyn+Nbh4hlrZh8bTj+ikVbcPbSiZG4EItGgGAUQUYys5znwjDkCQAQ9mdVW8VyJTPvHLaujMujW2AtTZX6tprfWMdMZ6qkTEMay0x87eYAANodAHWkP27s5EMDCBJANZRrO1uMcPM27A4187XbrlUAYahKWOfYBIDrL060/SMXL8+X7BgN9AD1x0r+CZ8gPXUZLn+Ks81/XKp4s+ulTyj7sq0V/fWyslN/HLZ5ntu/QDrKk+0ubtGTm7i9FVbH3jwKNWQ5U8+KCcnJzdxoqwMASLITJCdyPNgyQ+nzNKEXKxNdlHdwzk4caLsV98eIgbUDvOrpA2wlmT7344u4rm4YN/PFrFN4i2LfMGFjf2nc9GRx3aJAmO1Kdrk9u55cnITZZVuaAeV5Ls//nEdz/b7uwZvBRbeNITpXNo6h3dw2y/mkRUYVh+q+dOW2dy2ZT9p+Oe0YRiGZdle27dSTk5uouwE0dMpt+cPpyTeBGO65bntSzknUlaGsFvVLaUWw7AaP9V98l/JycnJyR0g+WYMmCRINjykuJDX3Zq7NknlXYOcpgSd7fJzeZbyv7pk1QzMDfarwuHKqtkKD7wKRhyANSee0qVPJZPlSDCBk28B8EQyWY73uZze0SaGZk1mL+mfUfhmciZhaX1sROxXFHhNpVLkBPrkfLZENvRnbNCGyC0kkhyZLEeCuWkfmNTvxic0tfsFIp2ifX3V6ibkKTSv1wi7a+wCrKekKuYEiSRHJk2A6Sssg9xrM38xIPWfhGkGVvcyxVV4Y33llanK+nxLOQ2jnQHZvNHYxyhLuil4VPCjp7fU2noviXeUbnY0JO/93rZ6an0inJeSSHJkkizMuSKwDIl/ReQdA13EPB26UzKCj+sKeKX9UjmhVPzd3pRH9jAb6Pwi+0DbCt490llq6vtyPpksRyJN4OYD4Qkkfv/f+8S/FaVZR1iU+xYNszsJxaVorb3UAYbV+Py+e82ZZx6pY3ceTCKAtVdnmV6Zs+KiTTGToyZGot4xgsxXS9bTYvhmHIDNm3/hl193r96sHs1kMpnM9rIUu7tKizfedeXCCkURdn12MOXs14oqfIBhKIqwa9P94TPLtvzaDzAMRREWk8lkMquSPZ6dWrn9kXs51wUmi8UWneFCETaLyWQyW7Jea55TWPc3A6wlyeG3Iwvn7LxpGF7LZDKZzHwf8qWN638iij5omuOs7u+fP3//fcvoOiaTyWTWhhvd2jV3weEndkm8IYoibFa284NjqxUUFeXljx596pDYwGQymcyaEJ1LP8zectcwrEzANMPu9v7lC47/5ZrajPAy3aw062u3n5E80prZvIQ3irBZnPOZYnF++96z6n6Zzf3nU+B09tslGh3fNH+XqltKmp/qvtOPDMPyW8vdH21f+eXy62bRJfzceLXX4+2rN980jy56x+ktVmf3+nmyh9VD80Ru6So3FaWlm3+2Sy5r41hGqW1eNUv2uG4sY5DbrsLh8srZF/RTpRCAoWwEYSIIE0GC/XWmUQFk8OZtW3c3r1HMvE6R3/80qBNgcCGt8x0TYSLIay/aZDIsSyJdz+rrFYZYkBftP2QYMnqbwWT1IQgTQfzcYM7UOsEtT6BvlMVmMxGkj83yciFCAJ5oGpHH82GgGwibmRZmPImqppKPoNhYBhiGomhHa42Dtx4EAAGGJ5DUFpl6vGpGmB31IeE2EIA/07MUZVhnfXC4rSwJnmtqp1OGMBGkprqAaA0IMGmhpaNxJbfbmqpc1RdECGgrOMYkIN15xbEXdYmQmtGewOwKBKksz3xiSVxo5WpaibDev/gUQREWgjARhFGUeMeMCGmYnw0vqOZdDhaCir6stBTpepvLkuBvHAOdaxEmghTkRV4yATIwab1rqJfwm11xXuRlU3iC1su7CSV1CMJEkNys0NNGAAKAYOJO5d8fKIJw3cjKeHPcEEBado9TyxsE3BD5YQ3FURcs6Zt8Et62oCj2UQDm+3TPaqUrRuFFY3YaTAKA9TUx/NSPriFGCN5YaHdtjrvqvlVXHfghWE9ttuv91VPnrb3xqozNfxw2F0ZonFu4QdmlPwrDmvLfqp0TBhiGYVhjTiDlrBDA+lWf7k08s0rCFGJ7fpDOecW/F2AlQfRrCmtPPnbN7a9MRYv8KRc2zNktHIY1x1nd23v0PPAu4JewogiS6/77afmNVzUC+ZslNEYYXNs6c/6hJ/aJTfzRiyLZjiqHV2++IxiHoXXB9HNKJ382jeBfjiy7m1Rj88gKsfdzxouLO/adGzaFWOP7dM+a06rPbl+z8Htb0IagKIYlGx1RmLf7L++M/lOWbHRw454b5tGMDkEExmvvlJ9zSC00X+DHJ+hs/2aXsm1yRZegZbSa4ooZx3TixCMshrp+8bTjUgEYX2EBOtOpw6UQm+IOaFBliYZweVcX7xmGokigF20yCcgAV88+lsA2VQUqFNIEopF6Dav/RkFRJC/CZAIMIOOIgbRBUcTXlThMChFld1WHKcDkqZbRhSiGjW2AYRjW01bn7KMHAQBRddd5pJbxBm5TQyntJRGiPVfwzuDf9czWxFSvVYC2xNLHtaWfE2hdTQHRmggB7Y2vYlM4be3VXiEvIKC22ua1bxvW0cgwcNWF1Iz2vsmtwXoLimMv6uh87xqfOjLnyxlJd82Jw6QQu6ucgu0XAPoPntFh7bw3QxQtyou8ZEIkAKMzodkCIXSTf4TbeiJ9l29CDA8CKIo2lMTfsdaEtGwfpJQPTBLmZwadMBwuhdhRrONuMUPb4a+s6lYMwz4ewBSvGI7hHKJEACv2I+5dct6uXLi9p640wYIqCrDtSzfSYoSemS1FkZo/LVx/x/kfDLCWZIffDiltv24YwU8VYS0JLx/snyt/9pkXf0A3x1nd26u0V8UqtkkYLGhjlPHNHUoHH/OjsMZIg2tbj12lv2GImOY4qhxetem2vmAmEc2yv33g4I8kT94LbradupWbl/iUzXsA7I+9a6bJ7FZ1TanlIRRF2Gw2m0/Uaq9H21acAf5ZDSJuJujsXDv7oBo/CKty+1lh8Tm1sAKRLfnQWDWl5f87OgjByu2lFoHxJQnAQv3on5IBZBiS0MMU3E8RLfD6L5UEAfhqtkAQ1hi9jQzLEI3otWwhYzT3JgwIxuGieUHJAMZm9Xm4wpOoFvoNnBM+XgBGX275NkYgZmhuLFW3IULU5xsFANZUz6DZAAJNf5NPRqVgLx21vqHWEADzzF8ZcQ+0p+UF7yIS51s6mVRhddW5qi8ABNTW2r3xa2tPzg7aqWZ0IChXkkU2Q0gSgJUWxd00AxDd6moMQzDWQpvy1TxMIADkXQSCsK5y6wCbOUT6br/EWKEopsEr1Fle0+bXlPKB+1NKArDc9IDD+trHQzPTujkNOMAGVW9jse/jbwjTFq2lRAsfQYUKlgcp4vgXAKwl2f7JIcXtNwwjGwWbURRB2IjgWsHmOMt7exT3qFjGDUyWN0YZ39qhePBRP8EaIw2ubT1+XTOoRMSyIUznwpYZm24LzYWh9cEaZ5VOqnCDsGx7tRdu3oPx670ApnhJ/23h4CM42eDAht03LGJLRdMMibq71s4iCBAsQXvrmp3KdqmV3SKWcRpKy78iHNWJFXfrVThcXjlb8aH3yOfABCQBwIoe0mmTAFgfUvGOKZxDaozeQSVPAIDgktXB6j/UoGdGloWBDAwrhdcJLhxGUJQtLq81PMAQVkeW60QKdUd0/8vBuAHYCsuwOIF2cQDrymOEHwDET/Wt7mcKX/i+5phE92VEIqRtfjiG+9yoq8579oII6Vgej2MUMeIv6xIhAL40tlNNY4TGuioa2T3LHekrjgQAawmJ81IExBlWnvoM4Xuiq8I20HYukUgwcvkjm0+wuKSAvZqAAMNzbQKsyvizwiiKIigqdp3P8ACrS7/3ymCBQ6hrdTevg48GsNOq7qnDPUdHTxIWcaBtlRmGJyCCjIyMjMz0r9eJkgzDsH8zwEre0K9u/ObkE/f8YQyLfMFP3357HviKe2AVePx+au13V/qziIMCDMtxUjm8Skk4BMMwNMv+1n5uEJZlpz4Uv94LYKe5RRziVe31cOuKzwmcoSEsAgGCoAO0EC7Aqlzvblz8qXhLCIKgI9piAYZFU75dNO24gVRDsOEB1hS7X50iy5nSh0U/3BoQIYBhKIoWRJrJkWD+n7jlDrFeajiAIb19WVcBkTOfJObbASwDw/+PRj8g5m1o1PQeAGO2JqZ6rSCK+YEyMHfuENI2P8QDWEdTqbG7LgR0lGx9dePdlhKJEACQmvEWB9+nrrqLrFzNR7zEZniAdVc5BdvPH8Rn7nUxchYAGIZhaGNZkspLTf6fmLiTRaeGhTQcwOqcAhxWASDiA29UcBsXO0X41A5RGyWJUk1PbNpz2TBs7AZg71NGj6II0l2X7/VgDQQRZGSmzhWaAMP+3QDTuLrxmx9/GxZghT5DAuzpqbXfXVEfHmC5TvfEAAzDsu1v7T/wI8krM2YYfkkbYIrXzWMYHYg48YP0Slfl7xYpKtumlHcOYjnIV0RT1i3aLt0QTBKA7VOnyAKwPqS8pY+NcN+XRT4D/4zT3vDcFJ7QDz+TiAJxP02SFCIq+o3sju6Mi9wIrIDTOKaWFL8HwPpaE1M9VxCJn+pb3ctoHeQMC/y63qaIeLelRNoaQ6srbi++VFNboqsLAd2FOlY7rXS+d4kXrkn+EEkOsBlWnvrFHcP7zBOKogjaGZPot1uTxxgt2wfi8oeYBBHYgFGBImitna8tJwIzZbRwBudIB0aq2Zjn14esA0NRFO2py/d8sGbKnIFFHP9KgLUk2T8+qLj9hlFU49CGTbGWKnsU996zihs4cpuiTW7tUDzwqL+efqgU4sUtiseeuaaJBiz1IRpnlU6qqNy8OzS/pA6wGxZxA1KIouICTEwKcThFU9Yt3v5QCoX0/ZIghVj4QIM2CQDIOaOp70P+pRiKYWhD5CYACAAQjCM+bA5sgP5RKcRcRvh+IhHSMt0dVSGuMxH1FpfEX9ElQgBAQGeTra92nOsSXhy2Pyh35HkuCVKIzcGxXgpEImTo+CjzQ54ZKIahnaVmvtazAYAGYZhERRyikn4KMdX05Ka9Y5xfEgCsvZrh+cd523LR9t76fM8/96+6wifY3wywutTUAFNTcXVHf38RR0ngoCFYc7yfv693DDdl0BRrqbLn6HngN/CJVeD59NThA49sE4WKOMQBjBuA6YkGYBiGYdn2t/cvh7aomEUO+UgQA7A0C4uAxEThaXAJAIZVez7culzxhqU4giXo6gbk9adLKl2Uv1ukqGwvjmBxGhoBjMEq6bFy+8srZl2QYhZRDMCK/GaoU86n9S8FazKxVv8PCUCGIYnCRRwYhmEF3lMppCsClfRFUeaTYGN67YA9lhoiNwEAEY21B6ybEwMwlN2d7SJLpvw8EHdcSQ1gXQ3FlmegSdPmnXpROpJ+RPQ+AOsrr0y9/ZwI0fQ3+2aK7mnQUesbaj3X/JWhQHUHdxoMAEjNaE9gagQj7hKHZ7pWp+OlsEePGIC1FOv5mK1yeO3EXQrVnZIRfESLCNGtrsUyRF9Xm/JpHibyzqGevGvdXJ78i43xgAoODOssNfe1nk3U3P86JWHAakkxAKvP+PWVgaJ3XOigQJM6wFJNT26+qeo2hteAYZgkAOtrYvipHVkNR4keaCtPtrr3YQDrrkixvbNr7Q6dBAG7rrKEF7eWfyYeYJ2MKNOrexSOGKXwWgbnl/QAVhZmeGcTBK08pOKYM3RHg8VgzfHWNrbm3gKPmkIfcO7bb8/DIghrija5vePYZbXXAmX0kQbXtioe/s0hWWjU5jrdP7JqwbFnLqlix2l9iMaZJ5Rh+IXVvSYdXX/qkR3/tk8Xwy+JAIZhSQb7N8zZRwrIEnlGJ+reMwsWWs4cr7V19YxDGuGFIq+dcRo3TcKHXM4cTZZftP2hV2GDdIKwgQAL9dP8guzk0NHD/4JC32lqZAiADSEVbUL7rhfco1EmGr1NZ/KXMxdFmU8iwZBRWLbo8sS82wAQJAMYwmZ5ucByZM83gzouLYB1NRRbnYEgCJo0ff4p69IR9CSs9wEYhnXWB4W/hAD4TN/qF6GEQUdmQehemsE2/yyhZ0F7tUfwCwgASMfyRFxVRyND31UXAmChNCbAMHEAKyuOv2OmfzggPZf/Swq1vUwhAGZaeRkwBLnU9DrK4zv6i9vx/OXMzeXJv9hoQpovf04sE571avQOdZGXGGC5Ga+PGpjejCsqHdR3KQOsxk91748PDMKGqN4aE5IMYI+/gSbPWHbBtgzlqacu3/PB9q+FFjK3MuJ0jv7fMgW1WMEsMNpcGEE/9L+V32vG8Vu7K5JtlVfOWrtDO57TX2dpvIfOsd23bu2HCATC3A379JOE3ehkRJlcU1y144l3NYqiaG1KmLPm0wF703M6a8t7wwGYfw3X3YE/i9P+LtObckpx4ym1oDoxluVhRsqbIAiC/rflgnbYMNtTtyTZPT40b9aOm0ZRjdy+ivwpF2+e/dNbdCFzrKXKnjnrL5D8CrmG+R5PT8vPE4y+MIwLsJkQgaB4XSuohGOZ43T/6GqCmOkvvrLs7QMihuEXhtUFko6uV/xJ83VuG4qiaJol0dIniL83PdexFNMTmxbsUnVLqRnsPHJU7fnwh+WfL79hEVfSybGsdL+/6ejvLwfsxlHpeve7xZ+uvOuQVtnFsaxwurXukKpzZvUwM87RFPlFNw3SpBSEFQfMpVMhAM6ltLUwMUaczXQ18vrgsuY+oYJDRqz151QSBADknNHcx0YxDG2M3kklyxKN1KqZQv+jJN/zEzIJAgAiunqzETYnWYQ16JoAGRgQ3HLFzoKxct0IAMiQyHfyMQRhZ4YZyZAp2wZNRKMowmqrDNlAJEKAPFXdJxj78HkO5ruqENV1BMKk6fNPWUvvXyp3t9U68QAWK+BeU0Opug0RApprhLeY6mqptPZ6TgAA0jLdE1WBYhja1xyT5LGMSFtp7e8lmgXv4BTTL7B0Nq3CsPYqlyArTjG9v1SGRSvDxM+cAMAKez+HWqylKvNPB+0Zlh66wv8Xq7Uy/am9FgEATiIRxTC0q8I20HYekb7TJz5aEGqNuSR3EwgACBj/FJZTyB0VndEJvrs0RRYyC6gh87GTIQSAgmdMUDPWUBx92Yo+3yHYuUp87h3FMLS9UMPF/CsAIKK5SnJJ+QgnwGr8VPedemDwdkxnDzEMk2gOrKM6y+bewn3A+MlagbqxqXMFgy/sXWni82O8Y58uWHfLqRLDsJ7qTKd7q3nNs9Zs1eaHXN0VybbKq3jHPl++5RePjJwEN/UHYuIvjurTvYl7ufYLN58YEH3VJjk/3SmmxG3JzosvMgQN23L81c9+LcZyxqaz9BCBWKw83Eh5s4zMzO8v6gzHL44YgepXFfq7m7Nb2TxmkHKjQp+/zn3bb7nxCu31gP+owUshvnppcG3bLJ7pptt6oUM9b7Ls7QMih+UXhnHSiEu4ve787ZVA9JVmfvqHxQNPz/KrJpGDb01d7flw64ov+o0PUoNzB3kQV7oof7f4037Lo9qD7sIhrHL7yyv2/ektrSisOGAundZfxLUhuKypT+z+UIUPNGifCNabGb9NHbiVVIHXfyjkgfWKMjCsFFEvft8pDMNQlJnr1m8pS6ZsixZ/0ljMXjcXMKBz8n81rE0/uAixq77I8ubMJX9GfGgHwuouqYw+BvhOfvrc/E56K8Z8l5bus1qgfbaJja7QAO3MKQ47IGAgo2a4zT9b3HOgt7gk4epztW9sA33bMAxrT8kJ2g10f3CVQgUHV60MYz+Lfk9mDqAXT81BMV6Kgj5rWt+KLxG9FE15ZHcTsaNinu3rl4PutYZh9ZmPnYz6jRc6hDgNQq+cNP9DBgP6Bzqnw3OzPqwIEa32fbb/kbbr0GmXMSJpbuaLS7pqjDC4tvWYuCpEUaEoyq3iQ7NCQpIyhyrfGN+KpsgfU5Mawv7lYrZUBKkfkBq/cP0DhKKpZqeuw0Ou/BxLwgE2NoWiCJLj8vD4mo1X6a+LhygxxzAMy3l19+AKaJOy0duE4ODojAxJwq/xq2iK/HF1v+JGnGEjEtpZV2B5azaOL1wCSrM4e4OkH1owPuiF4QAbo2qKMr61c64sT5tu6YaUDm7d8Fbn4vezZGVlZb8+TR509yhcuHhivqsOpexdeEaKk19jRSiKshGEJcGHPcaW0OH6AOEAw4UL1z9GbUlZQbtgWJZEGvaz0s7XbjxM8+AaQjjAcOHChQvXuBQOMFy4cOHCNS6FAwwXLly4cI1L/X9sbwtTYewNDAAAAABJRU5ErkJggg==" alt="" width="424" height="25" />

  8、 shutil.rmtree(path[, ignore_errors[, onerror]])
  递归的去删除文件

  aaarticlea/png;base64,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" alt="" width="319" height="26" />

  9、shutil.move(src, dst)
  递归的去移动文件

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

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

  base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,
    如:www                        =>保存至当前路径
    如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/

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

  root_dir: 要压缩的文件夹路径(默认当前目录)

  owner: 用户,默认当前用户

  group: 组,默认当前组

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

  1. #将 /Users/wupeiqi/Downloads/test 下的文件打包放置当前程序目录
  2. import shutil
  3. ret = shutil.make_archive("wwwwwwwwww", 'gztar', root_dir='/Users/wupeiqi/Downloads/test')
  4. #将 /Users/wupeiqi/Downloads/test 下的文件打包放置 /Users/wupeiqi/目录
  5. import shutil
  6. ret = shutil.make_archive("/Users/wupeiqi/wwwwwwwwww", 'gztar', root_dir='/Users/wupeiqi/Downloads/test')

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

  ①、zipfile

  1. import zipfile
  2. # 压缩
  3. z = zipfile.ZipFile('laxi.zip', 'w')
  4. z.write('a.log')
  5. z.write('data.data')
  6. z.close()
  7. # 解压
  8. z = zipfile.ZipFile('laxi.zip', 'r')
  9. z.extractall()
  10. z.close()

  ②、tarfile

  1. import tarfile
  2. # 压缩
  3. tar = tarfile.open('your.tar','w')
  4. tar.add('/Users/wupeiqi/PycharmProjects/bbs2.zip', arcname='bbs2.zip')
  5. tar.add('/Users/wupeiqi/PycharmProjects/cmdb.zip', arcname='cmdb.zip')
  6. tar.close()
  7. # 解压
  8. tar = tarfile.open('your.tar','r')
  9. tar.extractall() # 可设置解压地址
  10. tar.close()

  ③、ZipFile

  1. class ZipFile(object):
  2. """ Class with methods to open, read, write, close, list zip files.
  3.  
  4. z = ZipFile(file, mode="r", compression=ZIP_STORED, allowZip64=False)
  5.  
  6. file: Either the path to the file, or a file-like object.
  7. If it is a path, the file will be opened and closed by ZipFile.
  8. mode: The mode can be either read "r", write "w" or append "a".
  9. compression: ZIP_STORED (no compression) or ZIP_DEFLATED (requires zlib).
  10. allowZip64: if True ZipFile will create files with ZIP64 extensions when
  11. needed, otherwise it will raise an exception when this would
  12. be necessary.
  13.  
  14. """
  15.  
  16. fp = None # Set here since __del__ checks it
  17.  
  18. def __init__(self, file, mode="r", compression=ZIP_STORED, allowZip64=False):
  19. """Open the ZIP file with mode read "r", write "w" or append "a"."""
  20. if mode not in ("r", "w", "a"):
  21. raise RuntimeError('ZipFile() requires mode "r", "w", or "a"')
  22.  
  23. if compression == ZIP_STORED:
  24. pass
  25. elif compression == ZIP_DEFLATED:
  26. if not zlib:
  27. raise RuntimeError,\
  28. "Compression requires the (missing) zlib module"
  29. else:
  30. raise RuntimeError, "That compression method is not supported"
  31.  
  32. self._allowZip64 = allowZip64
  33. self._didModify = False
  34. self.debug = 0 # Level of printing: 0 through 3
  35. self.NameToInfo = {} # Find file info given name
  36. self.filelist = [] # List of ZipInfo instances for archive
  37. self.compression = compression # Method of compression
  38. self.mode = key = mode.replace('b', '')[0]
  39. self.pwd = None
  40. self._comment = ''
  41.  
  42. # Check if we were passed a file-like object
  43. if isinstance(file, basestring):
  44. self._filePassed = 0
  45. self.filename = file
  46. modeDict = {'r' : 'rb', 'w': 'wb', 'a' : 'r+b'}
  47. try:
  48. self.fp = open(file, modeDict[mode])
  49. except IOError:
  50. if mode == 'a':
  51. mode = key = 'w'
  52. self.fp = open(file, modeDict[mode])
  53. else:
  54. raise
  55. else:
  56. self._filePassed = 1
  57. self.fp = file
  58. self.filename = getattr(file, 'name', None)
  59.  
  60. try:
  61. if key == 'r':
  62. self._RealGetContents()
  63. elif key == 'w':
  64. # set the modified flag so central directory gets written
  65. # even if no files are added to the archive
  66. self._didModify = True
  67. elif key == 'a':
  68. try:
  69. # See if file is a zip file
  70. self._RealGetContents()
  71. # seek to start of directory and overwrite
  72. self.fp.seek(self.start_dir, 0)
  73. except BadZipfile:
  74. # file is not a zip file, just append
  75. self.fp.seek(0, 2)
  76.  
  77. # set the modified flag so central directory gets written
  78. # even if no files are added to the archive
  79. self._didModify = True
  80. else:
  81. raise RuntimeError('Mode must be "r", "w" or "a"')
  82. except:
  83. fp = self.fp
  84. self.fp = None
  85. if not self._filePassed:
  86. fp.close()
  87. raise
  88.  
  89. def __enter__(self):
  90. return self
  91.  
  92. def __exit__(self, type, value, traceback):
  93. self.close()
  94.  
  95. def _RealGetContents(self):
  96. """Read in the table of contents for the ZIP file."""
  97. fp = self.fp
  98. try:
  99. endrec = _EndRecData(fp)
  100. except IOError:
  101. raise BadZipfile("File is not a zip file")
  102. if not endrec:
  103. raise BadZipfile, "File is not a zip file"
  104. if self.debug > 1:
  105. print endrec
  106. size_cd = endrec[_ECD_SIZE] # bytes in central directory
  107. offset_cd = endrec[_ECD_OFFSET] # offset of central directory
  108. self._comment = endrec[_ECD_COMMENT] # archive comment
  109.  
  110. # "concat" is zero, unless zip was concatenated to another file
  111. concat = endrec[_ECD_LOCATION] - size_cd - offset_cd
  112. if endrec[_ECD_SIGNATURE] == stringEndArchive64:
  113. # If Zip64 extension structures are present, account for them
  114. concat -= (sizeEndCentDir64 + sizeEndCentDir64Locator)
  115.  
  116. if self.debug > 2:
  117. inferred = concat + offset_cd
  118. print "given, inferred, offset", offset_cd, inferred, concat
  119. # self.start_dir: Position of start of central directory
  120. self.start_dir = offset_cd + concat
  121. fp.seek(self.start_dir, 0)
  122. data = fp.read(size_cd)
  123. fp = cStringIO.StringIO(data)
  124. total = 0
  125. while total < size_cd:
  126. centdir = fp.read(sizeCentralDir)
  127. if len(centdir) != sizeCentralDir:
  128. raise BadZipfile("Truncated central directory")
  129. centdir = struct.unpack(structCentralDir, centdir)
  130. if centdir[_CD_SIGNATURE] != stringCentralDir:
  131. raise BadZipfile("Bad magic number for central directory")
  132. if self.debug > 2:
  133. print centdir
  134. filename = fp.read(centdir[_CD_FILENAME_LENGTH])
  135. # Create ZipInfo instance to store file information
  136. x = ZipInfo(filename)
  137. x.extra = fp.read(centdir[_CD_EXTRA_FIELD_LENGTH])
  138. x.comment = fp.read(centdir[_CD_COMMENT_LENGTH])
  139. x.header_offset = centdir[_CD_LOCAL_HEADER_OFFSET]
  140. (x.create_version, x.create_system, x.extract_version, x.reserved,
  141. x.flag_bits, x.compress_type, t, d,
  142. x.CRC, x.compress_size, x.file_size) = centdir[1:12]
  143. x.volume, x.internal_attr, x.external_attr = centdir[15:18]
  144. # Convert date/time code to (year, month, day, hour, min, sec)
  145. x._raw_time = t
  146. x.date_time = ( (d>>9)+1980, (d>>5)&0xF, d&0x1F,
  147. t>>11, (t>>5)&0x3F, (t&0x1F) * 2 )
  148.  
  149. x._decodeExtra()
  150. x.header_offset = x.header_offset + concat
  151. x.filename = x._decodeFilename()
  152. self.filelist.append(x)
  153. self.NameToInfo[x.filename] = x
  154.  
  155. # update total bytes read from central directory
  156. total = (total + sizeCentralDir + centdir[_CD_FILENAME_LENGTH]
  157. + centdir[_CD_EXTRA_FIELD_LENGTH]
  158. + centdir[_CD_COMMENT_LENGTH])
  159.  
  160. if self.debug > 2:
  161. print "total", total
  162.  
  163. def namelist(self):
  164. """Return a list of file names in the archive."""
  165. l = []
  166. for data in self.filelist:
  167. l.append(data.filename)
  168. return l
  169.  
  170. def infolist(self):
  171. """Return a list of class ZipInfo instances for files in the
  172. archive."""
  173. return self.filelist
  174.  
  175. def printdir(self):
  176. """Print a table of contents for the zip file."""
  177. print "%-46s %19s %12s" % ("File Name", "Modified ", "Size")
  178. for zinfo in self.filelist:
  179. date = "%d-%02d-%02d %02d:%02d:%02d" % zinfo.date_time[:6]
  180. print "%-46s %s %12d" % (zinfo.filename, date, zinfo.file_size)
  181.  
  182. def testzip(self):
  183. """Read all the files and check the CRC."""
  184. chunk_size = 2 ** 20
  185. for zinfo in self.filelist:
  186. try:
  187. # Read by chunks, to avoid an OverflowError or a
  188. # MemoryError with very large embedded files.
  189. with self.open(zinfo.filename, "r") as f:
  190. while f.read(chunk_size): # Check CRC-32
  191. pass
  192. except BadZipfile:
  193. return zinfo.filename
  194.  
  195. def getinfo(self, name):
  196. """Return the instance of ZipInfo given 'name'."""
  197. info = self.NameToInfo.get(name)
  198. if info is None:
  199. raise KeyError(
  200. 'There is no item named %r in the archive' % name)
  201.  
  202. return info
  203.  
  204. def setpassword(self, pwd):
  205. """Set default password for encrypted files."""
  206. self.pwd = pwd
  207.  
  208. @property
  209. def comment(self):
  210. """The comment text associated with the ZIP file."""
  211. return self._comment
  212.  
  213. @comment.setter
  214. def comment(self, comment):
  215. # check for valid comment length
  216. if len(comment) > ZIP_MAX_COMMENT:
  217. import warnings
  218. warnings.warn('Archive comment is too long; truncating to %d bytes'
  219. % ZIP_MAX_COMMENT, stacklevel=2)
  220. comment = comment[:ZIP_MAX_COMMENT]
  221. self._comment = comment
  222. self._didModify = True
  223.  
  224. def read(self, name, pwd=None):
  225. """Return file bytes (as a string) for name."""
  226. return self.open(name, "r", pwd).read()
  227.  
  228. def open(self, name, mode="r", pwd=None):
  229. """Return file-like object for 'name'."""
  230. if mode not in ("r", "U", "rU"):
  231. raise RuntimeError, 'open() requires mode "r", "U", or "rU"'
  232. if not self.fp:
  233. raise RuntimeError, \
  234. "Attempt to read ZIP archive that was already closed"
  235.  
  236. # Only open a new file for instances where we were not
  237. # given a file object in the constructor
  238. if self._filePassed:
  239. zef_file = self.fp
  240. should_close = False
  241. else:
  242. zef_file = open(self.filename, 'rb')
  243. should_close = True
  244.  
  245. try:
  246. # Make sure we have an info object
  247. if isinstance(name, ZipInfo):
  248. # 'name' is already an info object
  249. zinfo = name
  250. else:
  251. # Get info object for name
  252. zinfo = self.getinfo(name)
  253.  
  254. zef_file.seek(zinfo.header_offset, 0)
  255.  
  256. # Skip the file header:
  257. fheader = zef_file.read(sizeFileHeader)
  258. if len(fheader) != sizeFileHeader:
  259. raise BadZipfile("Truncated file header")
  260. fheader = struct.unpack(structFileHeader, fheader)
  261. if fheader[_FH_SIGNATURE] != stringFileHeader:
  262. raise BadZipfile("Bad magic number for file header")
  263.  
  264. fname = zef_file.read(fheader[_FH_FILENAME_LENGTH])
  265. if fheader[_FH_EXTRA_FIELD_LENGTH]:
  266. zef_file.read(fheader[_FH_EXTRA_FIELD_LENGTH])
  267.  
  268. if fname != zinfo.orig_filename:
  269. raise BadZipfile, \
  270. 'File name in directory "%s" and header "%s" differ.' % (
  271. zinfo.orig_filename, fname)
  272.  
  273. # check for encrypted flag & handle password
  274. is_encrypted = zinfo.flag_bits & 0x1
  275. zd = None
  276. if is_encrypted:
  277. if not pwd:
  278. pwd = self.pwd
  279. if not pwd:
  280. raise RuntimeError, "File %s is encrypted, " \
  281. "password required for extraction" % name
  282.  
  283. zd = _ZipDecrypter(pwd)
  284. # The first 12 bytes in the cypher stream is an encryption header
  285. # used to strengthen the algorithm. The first 11 bytes are
  286. # completely random, while the 12th contains the MSB of the CRC,
  287. # or the MSB of the file time depending on the header type
  288. # and is used to check the correctness of the password.
  289. bytes = zef_file.read(12)
  290. h = map(zd, bytes[0:12])
  291. if zinfo.flag_bits & 0x8:
  292. # compare against the file type from extended local headers
  293. check_byte = (zinfo._raw_time >> 8) & 0xff
  294. else:
  295. # compare against the CRC otherwise
  296. check_byte = (zinfo.CRC >> 24) & 0xff
  297. if ord(h[11]) != check_byte:
  298. raise RuntimeError("Bad password for file", name)
  299.  
  300. return ZipExtFile(zef_file, mode, zinfo, zd,
  301. close_fileobj=should_close)
  302. except:
  303. if should_close:
  304. zef_file.close()
  305. raise
  306.  
  307. def extract(self, member, path=None, pwd=None):
  308. """Extract a member from the archive to the current working directory,
  309. using its full name. Its file information is extracted as accurately
  310. as possible. `member' may be a filename or a ZipInfo object. You can
  311. specify a different directory using `path'.
  312. """
  313. if not isinstance(member, ZipInfo):
  314. member = self.getinfo(member)
  315.  
  316. if path is None:
  317. path = os.getcwd()
  318.  
  319. return self._extract_member(member, path, pwd)
  320.  
  321. def extractall(self, path=None, members=None, pwd=None):
  322. """Extract all members from the archive to the current working
  323. directory. `path' specifies a different directory to extract to.
  324. `members' is optional and must be a subset of the list returned
  325. by namelist().
  326. """
  327. if members is None:
  328. members = self.namelist()
  329.  
  330. for zipinfo in members:
  331. self.extract(zipinfo, path, pwd)
  332.  
  333. def _extract_member(self, member, targetpath, pwd):
  334. """Extract the ZipInfo object 'member' to a physical
  335. file on the path targetpath.
  336. """
  337. # build the destination pathname, replacing
  338. # forward slashes to platform specific separators.
  339. arcname = member.filename.replace('/', os.path.sep)
  340.  
  341. if os.path.altsep:
  342. arcname = arcname.replace(os.path.altsep, os.path.sep)
  343. # interpret absolute pathname as relative, remove drive letter or
  344. # UNC path, redundant separators, "." and ".." components.
  345. arcname = os.path.splitdrive(arcname)[1]
  346. arcname = os.path.sep.join(x for x in arcname.split(os.path.sep)
  347. if x not in ('', os.path.curdir, os.path.pardir))
  348. if os.path.sep == '\\':
  349. # filter illegal characters on Windows
  350. illegal = ':<>|"?*'
  351. if isinstance(arcname, unicode):
  352. table = {ord(c): ord('_') for c in illegal}
  353. else:
  354. table = string.maketrans(illegal, '_' * len(illegal))
  355. arcname = arcname.translate(table)
  356. # remove trailing dots
  357. arcname = (x.rstrip('.') for x in arcname.split(os.path.sep))
  358. arcname = os.path.sep.join(x for x in arcname if x)
  359.  
  360. targetpath = os.path.join(targetpath, arcname)
  361. targetpath = os.path.normpath(targetpath)
  362.  
  363. # Create all upper directories if necessary.
  364. upperdirs = os.path.dirname(targetpath)
  365. if upperdirs and not os.path.exists(upperdirs):
  366. os.makedirs(upperdirs)
  367.  
  368. if member.filename[-1] == '/':
  369. if not os.path.isdir(targetpath):
  370. os.mkdir(targetpath)
  371. return targetpath
  372.  
  373. with self.open(member, pwd=pwd) as source, \
  374. file(targetpath, "wb") as target:
  375. shutil.copyfileobj(source, target)
  376.  
  377. return targetpath
  378.  
  379. def _writecheck(self, zinfo):
  380. """Check for errors before writing a file to the archive."""
  381. if zinfo.filename in self.NameToInfo:
  382. import warnings
  383. warnings.warn('Duplicate name: %r' % zinfo.filename, stacklevel=3)
  384. if self.mode not in ("w", "a"):
  385. raise RuntimeError, 'write() requires mode "w" or "a"'
  386. if not self.fp:
  387. raise RuntimeError, \
  388. "Attempt to write ZIP archive that was already closed"
  389. if zinfo.compress_type == ZIP_DEFLATED and not zlib:
  390. raise RuntimeError, \
  391. "Compression requires the (missing) zlib module"
  392. if zinfo.compress_type not in (ZIP_STORED, ZIP_DEFLATED):
  393. raise RuntimeError, \
  394. "That compression method is not supported"
  395. if not self._allowZip64:
  396. requires_zip64 = None
  397. if len(self.filelist) >= ZIP_FILECOUNT_LIMIT:
  398. requires_zip64 = "Files count"
  399. elif zinfo.file_size > ZIP64_LIMIT:
  400. requires_zip64 = "Filesize"
  401. elif zinfo.header_offset > ZIP64_LIMIT:
  402. requires_zip64 = "Zipfile size"
  403. if requires_zip64:
  404. raise LargeZipFile(requires_zip64 +
  405. " would require ZIP64 extensions")
  406.  
  407. def write(self, filename, arcname=None, compress_type=None):
  408. """Put the bytes from filename into the archive under the name
  409. arcname."""
  410. if not self.fp:
  411. raise RuntimeError(
  412. "Attempt to write to ZIP archive that was already closed")
  413.  
  414. st = os.stat(filename)
  415. isdir = stat.S_ISDIR(st.st_mode)
  416. mtime = time.localtime(st.st_mtime)
  417. date_time = mtime[0:6]
  418. # Create ZipInfo instance to store file information
  419. if arcname is None:
  420. arcname = filename
  421. arcname = os.path.normpath(os.path.splitdrive(arcname)[1])
  422. while arcname[0] in (os.sep, os.altsep):
  423. arcname = arcname[1:]
  424. if isdir:
  425. arcname += '/'
  426. zinfo = ZipInfo(arcname, date_time)
  427. zinfo.external_attr = (st[0] & 0xFFFF) << 16L # Unix attributes
  428. if compress_type is None:
  429. zinfo.compress_type = self.compression
  430. else:
  431. zinfo.compress_type = compress_type
  432.  
  433. zinfo.file_size = st.st_size
  434. zinfo.flag_bits = 0x00
  435. zinfo.header_offset = self.fp.tell() # Start of header bytes
  436.  
  437. self._writecheck(zinfo)
  438. self._didModify = True
  439.  
  440. if isdir:
  441. zinfo.file_size = 0
  442. zinfo.compress_size = 0
  443. zinfo.CRC = 0
  444. zinfo.external_attr |= 0x10 # MS-DOS directory flag
  445. self.filelist.append(zinfo)
  446. self.NameToInfo[zinfo.filename] = zinfo
  447. self.fp.write(zinfo.FileHeader(False))
  448. return
  449.  
  450. with open(filename, "rb") as fp:
  451. # Must overwrite CRC and sizes with correct data later
  452. zinfo.CRC = CRC = 0
  453. zinfo.compress_size = compress_size = 0
  454. # Compressed size can be larger than uncompressed size
  455. zip64 = self._allowZip64 and \
  456. zinfo.file_size * 1.05 > ZIP64_LIMIT
  457. self.fp.write(zinfo.FileHeader(zip64))
  458. if zinfo.compress_type == ZIP_DEFLATED:
  459. cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
  460. zlib.DEFLATED, -15)
  461. else:
  462. cmpr = None
  463. file_size = 0
  464. while 1:
  465. buf = fp.read(1024 * 8)
  466. if not buf:
  467. break
  468. file_size = file_size + len(buf)
  469. CRC = crc32(buf, CRC) & 0xffffffff
  470. if cmpr:
  471. buf = cmpr.compress(buf)
  472. compress_size = compress_size + len(buf)
  473. self.fp.write(buf)
  474. if cmpr:
  475. buf = cmpr.flush()
  476. compress_size = compress_size + len(buf)
  477. self.fp.write(buf)
  478. zinfo.compress_size = compress_size
  479. else:
  480. zinfo.compress_size = file_size
  481. zinfo.CRC = CRC
  482. zinfo.file_size = file_size
  483. if not zip64 and self._allowZip64:
  484. if file_size > ZIP64_LIMIT:
  485. raise RuntimeError('File size has increased during compressing')
  486. if compress_size > ZIP64_LIMIT:
  487. raise RuntimeError('Compressed size larger than uncompressed size')
  488. # Seek backwards and write file header (which will now include
  489. # correct CRC and file sizes)
  490. position = self.fp.tell() # Preserve current position in file
  491. self.fp.seek(zinfo.header_offset, 0)
  492. self.fp.write(zinfo.FileHeader(zip64))
  493. self.fp.seek(position, 0)
  494. self.filelist.append(zinfo)
  495. self.NameToInfo[zinfo.filename] = zinfo
  496.  
  497. def writestr(self, zinfo_or_arcname, bytes, compress_type=None):
  498. """Write a file into the archive. The contents is the string
  499. 'bytes'. 'zinfo_or_arcname' is either a ZipInfo instance or
  500. the name of the file in the archive."""
  501. if not isinstance(zinfo_or_arcname, ZipInfo):
  502. zinfo = ZipInfo(filename=zinfo_or_arcname,
  503. date_time=time.localtime(time.time())[:6])
  504.  
  505. zinfo.compress_type = self.compression
  506. if zinfo.filename[-1] == '/':
  507. zinfo.external_attr = 0o40775 << 16 # drwxrwxr-x
  508. zinfo.external_attr |= 0x10 # MS-DOS directory flag
  509. else:
  510. zinfo.external_attr = 0o600 << 16 # ?rw-------
  511. else:
  512. zinfo = zinfo_or_arcname
  513.  
  514. if not self.fp:
  515. raise RuntimeError(
  516. "Attempt to write to ZIP archive that was already closed")
  517.  
  518. if compress_type is not None:
  519. zinfo.compress_type = compress_type
  520.  
  521. zinfo.file_size = len(bytes) # Uncompressed size
  522. zinfo.header_offset = self.fp.tell() # Start of header bytes
  523. self._writecheck(zinfo)
  524. self._didModify = True
  525. zinfo.CRC = crc32(bytes) & 0xffffffff # CRC-32 checksum
  526. if zinfo.compress_type == ZIP_DEFLATED:
  527. co = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
  528. zlib.DEFLATED, -15)
  529. bytes = co.compress(bytes) + co.flush()
  530. zinfo.compress_size = len(bytes) # Compressed size
  531. else:
  532. zinfo.compress_size = zinfo.file_size
  533. zip64 = zinfo.file_size > ZIP64_LIMIT or \
  534. zinfo.compress_size > ZIP64_LIMIT
  535. if zip64 and not self._allowZip64:
  536. raise LargeZipFile("Filesize would require ZIP64 extensions")
  537. self.fp.write(zinfo.FileHeader(zip64))
  538. self.fp.write(bytes)
  539. if zinfo.flag_bits & 0x08:
  540. # Write CRC and file sizes after the file data
  541. fmt = '<LQQ' if zip64 else '<LLL'
  542. self.fp.write(struct.pack(fmt, zinfo.CRC, zinfo.compress_size,
  543. zinfo.file_size))
  544. self.fp.flush()
  545. self.filelist.append(zinfo)
  546. self.NameToInfo[zinfo.filename] = zinfo
  547.  
  548. def __del__(self):
  549. """Call the "close()" method in case the user forgot."""
  550. self.close()
  551.  
  552. def close(self):
  553. """Close the file, and for mode "w" and "a" write the ending
  554. records."""
  555. if self.fp is None:
  556. return
  557.  
  558. try:
  559. if self.mode in ("w", "a") and self._didModify: # write ending records
  560. pos1 = self.fp.tell()
  561. for zinfo in self.filelist: # write central directory
  562. dt = zinfo.date_time
  563. dosdate = (dt[0] - 1980) << 9 | dt[1] << 5 | dt[2]
  564. dostime = dt[3] << 11 | dt[4] << 5 | (dt[5] // 2)
  565. extra = []
  566. if zinfo.file_size > ZIP64_LIMIT \
  567. or zinfo.compress_size > ZIP64_LIMIT:
  568. extra.append(zinfo.file_size)
  569. extra.append(zinfo.compress_size)
  570. file_size = 0xffffffff
  571. compress_size = 0xffffffff
  572. else:
  573. file_size = zinfo.file_size
  574. compress_size = zinfo.compress_size
  575.  
  576. if zinfo.header_offset > ZIP64_LIMIT:
  577. extra.append(zinfo.header_offset)
  578. header_offset = 0xffffffffL
  579. else:
  580. header_offset = zinfo.header_offset
  581.  
  582. extra_data = zinfo.extra
  583. if extra:
  584. # Append a ZIP64 field to the extra's
  585. extra_data = struct.pack(
  586. '<HH' + 'Q'*len(extra),
  587. 1, 8*len(extra), *extra) + extra_data
  588.  
  589. extract_version = max(45, zinfo.extract_version)
  590. create_version = max(45, zinfo.create_version)
  591. else:
  592. extract_version = zinfo.extract_version
  593. create_version = zinfo.create_version
  594.  
  595. try:
  596. filename, flag_bits = zinfo._encodeFilenameFlags()
  597. centdir = struct.pack(structCentralDir,
  598. stringCentralDir, create_version,
  599. zinfo.create_system, extract_version, zinfo.reserved,
  600. flag_bits, zinfo.compress_type, dostime, dosdate,
  601. zinfo.CRC, compress_size, file_size,
  602. len(filename), len(extra_data), len(zinfo.comment),
  603. 0, zinfo.internal_attr, zinfo.external_attr,
  604. header_offset)
  605. except DeprecationWarning:
  606. print >>sys.stderr, (structCentralDir,
  607. stringCentralDir, create_version,
  608. zinfo.create_system, extract_version, zinfo.reserved,
  609. zinfo.flag_bits, zinfo.compress_type, dostime, dosdate,
  610. zinfo.CRC, compress_size, file_size,
  611. len(zinfo.filename), len(extra_data), len(zinfo.comment),
  612. 0, zinfo.internal_attr, zinfo.external_attr,
  613. header_offset)
  614. raise
  615. self.fp.write(centdir)
  616. self.fp.write(filename)
  617. self.fp.write(extra_data)
  618. self.fp.write(zinfo.comment)
  619.  
  620. pos2 = self.fp.tell()
  621. # Write end-of-zip-archive record
  622. centDirCount = len(self.filelist)
  623. centDirSize = pos2 - pos1
  624. centDirOffset = pos1
  625. requires_zip64 = None
  626. if centDirCount > ZIP_FILECOUNT_LIMIT:
  627. requires_zip64 = "Files count"
  628. elif centDirOffset > ZIP64_LIMIT:
  629. requires_zip64 = "Central directory offset"
  630. elif centDirSize > ZIP64_LIMIT:
  631. requires_zip64 = "Central directory size"
  632. if requires_zip64:
  633. # Need to write the ZIP64 end-of-archive records
  634. if not self._allowZip64:
  635. raise LargeZipFile(requires_zip64 +
  636. " would require ZIP64 extensions")
  637. zip64endrec = struct.pack(
  638. structEndArchive64, stringEndArchive64,
  639. 44, 45, 45, 0, 0, centDirCount, centDirCount,
  640. centDirSize, centDirOffset)
  641. self.fp.write(zip64endrec)
  642.  
  643. zip64locrec = struct.pack(
  644. structEndArchive64Locator,
  645. stringEndArchive64Locator, 0, pos2, 1)
  646. self.fp.write(zip64locrec)
  647. centDirCount = min(centDirCount, 0xFFFF)
  648. centDirSize = min(centDirSize, 0xFFFFFFFF)
  649. centDirOffset = min(centDirOffset, 0xFFFFFFFF)
  650.  
  651. endrec = struct.pack(structEndArchive, stringEndArchive,
  652. 0, 0, centDirCount, centDirCount,
  653. centDirSize, centDirOffset, len(self._comment))
  654. self.fp.write(endrec)
  655. self.fp.write(self._comment)
  656. self.fp.flush()
  657. finally:
  658. fp = self.fp
  659. self.fp = None
  660. if not self._filePassed:
  661. fp.close()

  ④、TarFile

  1. class TarFile(object):
  2. """The TarFile Class provides an interface to tar archives.
  3. """
  4.  
  5. debug = 0 # May be set from 0 (no msgs) to 3 (all msgs)
  6.  
  7. dereference = False # If true, add content of linked file to the
  8. # tar file, else the link.
  9.  
  10. ignore_zeros = False # If true, skips empty or invalid blocks and
  11. # continues processing.
  12.  
  13. errorlevel = 1 # If 0, fatal errors only appear in debug
  14. # messages (if debug >= 0). If > 0, errors
  15. # are passed to the caller as exceptions.
  16.  
  17. format = DEFAULT_FORMAT # The format to use when creating an archive.
  18.  
  19. encoding = ENCODING # Encoding for 8-bit character strings.
  20.  
  21. errors = None # Error handler for unicode conversion.
  22.  
  23. tarinfo = TarInfo # The default TarInfo class to use.
  24.  
  25. fileobject = ExFileObject # The default ExFileObject class to use.
  26.  
  27. def __init__(self, name=None, mode="r", fileobj=None, format=None,
  28. tarinfo=None, dereference=None, ignore_zeros=None, encoding=None,
  29. errors=None, pax_headers=None, debug=None, errorlevel=None):
  30. """Open an (uncompressed) tar archive `name'. `mode' is either 'r' to
  31. read from an existing archive, 'a' to append data to an existing
  32. file or 'w' to create a new file overwriting an existing one. `mode'
  33. defaults to 'r'.
  34. If `fileobj' is given, it is used for reading or writing data. If it
  35. can be determined, `mode' is overridden by `fileobj's mode.
  36. `fileobj' is not closed, when TarFile is closed.
  37. """
  38. modes = {"r": "rb", "a": "r+b", "w": "wb"}
  39. if mode not in modes:
  40. raise ValueError("mode must be 'r', 'a' or 'w'")
  41. self.mode = mode
  42. self._mode = modes[mode]
  43.  
  44. if not fileobj:
  45. if self.mode == "a" and not os.path.exists(name):
  46. # Create nonexistent files in append mode.
  47. self.mode = "w"
  48. self._mode = "wb"
  49. fileobj = bltn_open(name, self._mode)
  50. self._extfileobj = False
  51. else:
  52. if name is None and hasattr(fileobj, "name"):
  53. name = fileobj.name
  54. if hasattr(fileobj, "mode"):
  55. self._mode = fileobj.mode
  56. self._extfileobj = True
  57. self.name = os.path.abspath(name) if name else None
  58. self.fileobj = fileobj
  59.  
  60. # Init attributes.
  61. if format is not None:
  62. self.format = format
  63. if tarinfo is not None:
  64. self.tarinfo = tarinfo
  65. if dereference is not None:
  66. self.dereference = dereference
  67. if ignore_zeros is not None:
  68. self.ignore_zeros = ignore_zeros
  69. if encoding is not None:
  70. self.encoding = encoding
  71.  
  72. if errors is not None:
  73. self.errors = errors
  74. elif mode == "r":
  75. self.errors = "utf-8"
  76. else:
  77. self.errors = "strict"
  78.  
  79. if pax_headers is not None and self.format == PAX_FORMAT:
  80. self.pax_headers = pax_headers
  81. else:
  82. self.pax_headers = {}
  83.  
  84. if debug is not None:
  85. self.debug = debug
  86. if errorlevel is not None:
  87. self.errorlevel = errorlevel
  88.  
  89. # Init datastructures.
  90. self.closed = False
  91. self.members = [] # list of members as TarInfo objects
  92. self._loaded = False # flag if all members have been read
  93. self.offset = self.fileobj.tell()
  94. # current position in the archive file
  95. self.inodes = {} # dictionary caching the inodes of
  96. # archive members already added
  97.  
  98. try:
  99. if self.mode == "r":
  100. self.firstmember = None
  101. self.firstmember = self.next()
  102.  
  103. if self.mode == "a":
  104. # Move to the end of the archive,
  105. # before the first empty block.
  106. while True:
  107. self.fileobj.seek(self.offset)
  108. try:
  109. tarinfo = self.tarinfo.fromtarfile(self)
  110. self.members.append(tarinfo)
  111. except EOFHeaderError:
  112. self.fileobj.seek(self.offset)
  113. break
  114. except HeaderError, e:
  115. raise ReadError(str(e))
  116.  
  117. if self.mode in "aw":
  118. self._loaded = True
  119.  
  120. if self.pax_headers:
  121. buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy())
  122. self.fileobj.write(buf)
  123. self.offset += len(buf)
  124. except:
  125. if not self._extfileobj:
  126. self.fileobj.close()
  127. self.closed = True
  128. raise
  129.  
  130. def _getposix(self):
  131. return self.format == USTAR_FORMAT
  132. def _setposix(self, value):
  133. import warnings
  134. warnings.warn("use the format attribute instead", DeprecationWarning,
  135. 2)
  136. if value:
  137. self.format = USTAR_FORMAT
  138. else:
  139. self.format = GNU_FORMAT
  140. posix = property(_getposix, _setposix)
  141.  
  142. #--------------------------------------------------------------------------
  143. # Below are the classmethods which act as alternate constructors to the
  144. # TarFile class. The open() method is the only one that is needed for
  145. # public use; it is the "super"-constructor and is able to select an
  146. # adequate "sub"-constructor for a particular compression using the mapping
  147. # from OPEN_METH.
  148. #
  149. # This concept allows one to subclass TarFile without losing the comfort of
  150. # the super-constructor. A sub-constructor is registered and made available
  151. # by adding it to the mapping in OPEN_METH.
  152.  
  153. @classmethod
  154. def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, **kwargs):
  155. """Open a tar archive for reading, writing or appending. Return
  156. an appropriate TarFile class.
  157.  
  158. mode:
  159. 'r' or 'r:*' open for reading with transparent compression
  160. 'r:' open for reading exclusively uncompressed
  161. 'r:gz' open for reading with gzip compression
  162. 'r:bz2' open for reading with bzip2 compression
  163. 'a' or 'a:' open for appending, creating the file if necessary
  164. 'w' or 'w:' open for writing without compression
  165. 'w:gz' open for writing with gzip compression
  166. 'w:bz2' open for writing with bzip2 compression
  167.  
  168. 'r|*' open a stream of tar blocks with transparent compression
  169. 'r|' open an uncompressed stream of tar blocks for reading
  170. 'r|gz' open a gzip compressed stream of tar blocks
  171. 'r|bz2' open a bzip2 compressed stream of tar blocks
  172. 'w|' open an uncompressed stream for writing
  173. 'w|gz' open a gzip compressed stream for writing
  174. 'w|bz2' open a bzip2 compressed stream for writing
  175. """
  176.  
  177. if not name and not fileobj:
  178. raise ValueError("nothing to open")
  179.  
  180. if mode in ("r", "r:*"):
  181. # Find out which *open() is appropriate for opening the file.
  182. for comptype in cls.OPEN_METH:
  183. func = getattr(cls, cls.OPEN_METH[comptype])
  184. if fileobj is not None:
  185. saved_pos = fileobj.tell()
  186. try:
  187. return func(name, "r", fileobj, **kwargs)
  188. except (ReadError, CompressionError), e:
  189. if fileobj is not None:
  190. fileobj.seek(saved_pos)
  191. continue
  192. raise ReadError("file could not be opened successfully")
  193.  
  194. elif ":" in mode:
  195. filemode, comptype = mode.split(":", 1)
  196. filemode = filemode or "r"
  197. comptype = comptype or "tar"
  198.  
  199. # Select the *open() function according to
  200. # given compression.
  201. if comptype in cls.OPEN_METH:
  202. func = getattr(cls, cls.OPEN_METH[comptype])
  203. else:
  204. raise CompressionError("unknown compression type %r" % comptype)
  205. return func(name, filemode, fileobj, **kwargs)
  206.  
  207. elif "|" in mode:
  208. filemode, comptype = mode.split("|", 1)
  209. filemode = filemode or "r"
  210. comptype = comptype or "tar"
  211.  
  212. if filemode not in ("r", "w"):
  213. raise ValueError("mode must be 'r' or 'w'")
  214.  
  215. stream = _Stream(name, filemode, comptype, fileobj, bufsize)
  216. try:
  217. t = cls(name, filemode, stream, **kwargs)
  218. except:
  219. stream.close()
  220. raise
  221. t._extfileobj = False
  222. return t
  223.  
  224. elif mode in ("a", "w"):
  225. return cls.taropen(name, mode, fileobj, **kwargs)
  226.  
  227. raise ValueError("undiscernible mode")
  228.  
  229. @classmethod
  230. def taropen(cls, name, mode="r", fileobj=None, **kwargs):
  231. """Open uncompressed tar archive name for reading or writing.
  232. """
  233. if mode not in ("r", "a", "w"):
  234. raise ValueError("mode must be 'r', 'a' or 'w'")
  235. return cls(name, mode, fileobj, **kwargs)
  236.  
  237. @classmethod
  238. def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs):
  239. """Open gzip compressed tar archive name for reading or writing.
  240. Appending is not allowed.
  241. """
  242. if mode not in ("r", "w"):
  243. raise ValueError("mode must be 'r' or 'w'")
  244.  
  245. try:
  246. import gzip
  247. gzip.GzipFile
  248. except (ImportError, AttributeError):
  249. raise CompressionError("gzip module is not available")
  250.  
  251. try:
  252. fileobj = gzip.GzipFile(name, mode, compresslevel, fileobj)
  253. except OSError:
  254. if fileobj is not None and mode == 'r':
  255. raise ReadError("not a gzip file")
  256. raise
  257.  
  258. try:
  259. t = cls.taropen(name, mode, fileobj, **kwargs)
  260. except IOError:
  261. fileobj.close()
  262. if mode == 'r':
  263. raise ReadError("not a gzip file")
  264. raise
  265. except:
  266. fileobj.close()
  267. raise
  268. t._extfileobj = False
  269. return t
  270.  
  271. @classmethod
  272. def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs):
  273. """Open bzip2 compressed tar archive name for reading or writing.
  274. Appending is not allowed.
  275. """
  276. if mode not in ("r", "w"):
  277. raise ValueError("mode must be 'r' or 'w'.")
  278.  
  279. try:
  280. import bz2
  281. except ImportError:
  282. raise CompressionError("bz2 module is not available")
  283.  
  284. if fileobj is not None:
  285. fileobj = _BZ2Proxy(fileobj, mode)
  286. else:
  287. fileobj = bz2.BZ2File(name, mode, compresslevel=compresslevel)
  288.  
  289. try:
  290. t = cls.taropen(name, mode, fileobj, **kwargs)
  291. except (IOError, EOFError):
  292. fileobj.close()
  293. if mode == 'r':
  294. raise ReadError("not a bzip2 file")
  295. raise
  296. except:
  297. fileobj.close()
  298. raise
  299. t._extfileobj = False
  300. return t
  301.  
  302. # All *open() methods are registered here.
  303. OPEN_METH = {
  304. "tar": "taropen", # uncompressed tar
  305. "gz": "gzopen", # gzip compressed tar
  306. "bz2": "bz2open" # bzip2 compressed tar
  307. }
  308.  
  309. #--------------------------------------------------------------------------
  310. # The public methods which TarFile provides:
  311.  
  312. def close(self):
  313. """Close the TarFile. In write-mode, two finishing zero blocks are
  314. appended to the archive.
  315. """
  316. if self.closed:
  317. return
  318.  
  319. if self.mode in "aw":
  320. self.fileobj.write(NUL * (BLOCKSIZE * 2))
  321. self.offset += (BLOCKSIZE * 2)
  322. # fill up the end with zero-blocks
  323. # (like option -b20 for tar does)
  324. blocks, remainder = divmod(self.offset, RECORDSIZE)
  325. if remainder > 0:
  326. self.fileobj.write(NUL * (RECORDSIZE - remainder))
  327.  
  328. if not self._extfileobj:
  329. self.fileobj.close()
  330. self.closed = True
  331.  
  332. def getmember(self, name):
  333. """Return a TarInfo object for member `name'. If `name' can not be
  334. found in the archive, KeyError is raised. If a member occurs more
  335. than once in the archive, its last occurrence is assumed to be the
  336. most up-to-date version.
  337. """
  338. tarinfo = self._getmember(name)
  339. if tarinfo is None:
  340. raise KeyError("filename %r not found" % name)
  341. return tarinfo
  342.  
  343. def getmembers(self):
  344. """Return the members of the archive as a list of TarInfo objects. The
  345. list has the same order as the members in the archive.
  346. """
  347. self._check()
  348. if not self._loaded: # if we want to obtain a list of
  349. self._load() # all members, we first have to
  350. # scan the whole archive.
  351. return self.members
  352.  
  353. def getnames(self):
  354. """Return the members of the archive as a list of their names. It has
  355. the same order as the list returned by getmembers().
  356. """
  357. return [tarinfo.name for tarinfo in self.getmembers()]
  358.  
  359. def gettarinfo(self, name=None, arcname=None, fileobj=None):
  360. """Create a TarInfo object for either the file `name' or the file
  361. object `fileobj' (using os.fstat on its file descriptor). You can
  362. modify some of the TarInfo's attributes before you add it using
  363. addfile(). If given, `arcname' specifies an alternative name for the
  364. file in the archive.
  365. """
  366. self._check("aw")
  367.  
  368. # When fileobj is given, replace name by
  369. # fileobj's real name.
  370. if fileobj is not None:
  371. name = fileobj.name
  372.  
  373. # Building the name of the member in the archive.
  374. # Backward slashes are converted to forward slashes,
  375. # Absolute paths are turned to relative paths.
  376. if arcname is None:
  377. arcname = name
  378. drv, arcname = os.path.splitdrive(arcname)
  379. arcname = arcname.replace(os.sep, "/")
  380. arcname = arcname.lstrip("/")
  381.  
  382. # Now, fill the TarInfo object with
  383. # information specific for the file.
  384. tarinfo = self.tarinfo()
  385. tarinfo.tarfile = self
  386.  
  387. # Use os.stat or os.lstat, depending on platform
  388. # and if symlinks shall be resolved.
  389. if fileobj is None:
  390. if hasattr(os, "lstat") and not self.dereference:
  391. statres = os.lstat(name)
  392. else:
  393. statres = os.stat(name)
  394. else:
  395. statres = os.fstat(fileobj.fileno())
  396. linkname = ""
  397.  
  398. stmd = statres.st_mode
  399. if stat.S_ISREG(stmd):
  400. inode = (statres.st_ino, statres.st_dev)
  401. if not self.dereference and statres.st_nlink > 1 and \
  402. inode in self.inodes and arcname != self.inodes[inode]:
  403. # Is it a hardlink to an already
  404. # archived file?
  405. type = LNKTYPE
  406. linkname = self.inodes[inode]
  407. else:
  408. # The inode is added only if its valid.
  409. # For win32 it is always 0.
  410. type = REGTYPE
  411. if inode[0]:
  412. self.inodes[inode] = arcname
  413. elif stat.S_ISDIR(stmd):
  414. type = DIRTYPE
  415. elif stat.S_ISFIFO(stmd):
  416. type = FIFOTYPE
  417. elif stat.S_ISLNK(stmd):
  418. type = SYMTYPE
  419. linkname = os.readlink(name)
  420. elif stat.S_ISCHR(stmd):
  421. type = CHRTYPE
  422. elif stat.S_ISBLK(stmd):
  423. type = BLKTYPE
  424. else:
  425. return None
  426.  
  427. # Fill the TarInfo object with all
  428. # information we can get.
  429. tarinfo.name = arcname
  430. tarinfo.mode = stmd
  431. tarinfo.uid = statres.st_uid
  432. tarinfo.gid = statres.st_gid
  433. if type == REGTYPE:
  434. tarinfo.size = statres.st_size
  435. else:
  436. tarinfo.size = 0L
  437. tarinfo.mtime = statres.st_mtime
  438. tarinfo.type = type
  439. tarinfo.linkname = linkname
  440. if pwd:
  441. try:
  442. tarinfo.uname = pwd.getpwuid(tarinfo.uid)[0]
  443. except KeyError:
  444. pass
  445. if grp:
  446. try:
  447. tarinfo.gname = grp.getgrgid(tarinfo.gid)[0]
  448. except KeyError:
  449. pass
  450.  
  451. if type in (CHRTYPE, BLKTYPE):
  452. if hasattr(os, "major") and hasattr(os, "minor"):
  453. tarinfo.devmajor = os.major(statres.st_rdev)
  454. tarinfo.devminor = os.minor(statres.st_rdev)
  455. return tarinfo
  456.  
  457. def list(self, verbose=True):
  458. """Print a table of contents to sys.stdout. If `verbose' is False, only
  459. the names of the members are printed. If it is True, an `ls -l'-like
  460. output is produced.
  461. """
  462. self._check()
  463.  
  464. for tarinfo in self:
  465. if verbose:
  466. print filemode(tarinfo.mode),
  467. print "%s/%s" % (tarinfo.uname or tarinfo.uid,
  468. tarinfo.gname or tarinfo.gid),
  469. if tarinfo.ischr() or tarinfo.isblk():
  470. print "%10s" % ("%d,%d" \
  471. % (tarinfo.devmajor, tarinfo.devminor)),
  472. else:
  473. print "%10d" % tarinfo.size,
  474. print "%d-%02d-%02d %02d:%02d:%02d" \
  475. % time.localtime(tarinfo.mtime)[:6],
  476.  
  477. print tarinfo.name + ("/" if tarinfo.isdir() else ""),
  478.  
  479. if verbose:
  480. if tarinfo.issym():
  481. print "->", tarinfo.linkname,
  482. if tarinfo.islnk():
  483. print "link to", tarinfo.linkname,
  484. print
  485.  
  486. def add(self, name, arcname=None, recursive=True, exclude=None, filter=None):
  487. """Add the file `name' to the archive. `name' may be any type of file
  488. (directory, fifo, symbolic link, etc.). If given, `arcname'
  489. specifies an alternative name for the file in the archive.
  490. Directories are added recursively by default. This can be avoided by
  491. setting `recursive' to False. `exclude' is a function that should
  492. return True for each filename to be excluded. `filter' is a function
  493. that expects a TarInfo object argument and returns the changed
  494. TarInfo object, if it returns None the TarInfo object will be
  495. excluded from the archive.
  496. """
  497. self._check("aw")
  498.  
  499. if arcname is None:
  500. arcname = name
  501.  
  502. # Exclude pathnames.
  503. if exclude is not None:
  504. import warnings
  505. warnings.warn("use the filter argument instead",
  506. DeprecationWarning, 2)
  507. if exclude(name):
  508. self._dbg(2, "tarfile: Excluded %r" % name)
  509. return
  510.  
  511. # Skip if somebody tries to archive the archive...
  512. if self.name is not None and os.path.abspath(name) == self.name:
  513. self._dbg(2, "tarfile: Skipped %r" % name)
  514. return
  515.  
  516. self._dbg(1, name)
  517.  
  518. # Create a TarInfo object from the file.
  519. tarinfo = self.gettarinfo(name, arcname)
  520.  
  521. if tarinfo is None:
  522. self._dbg(1, "tarfile: Unsupported type %r" % name)
  523. return
  524.  
  525. # Change or exclude the TarInfo object.
  526. if filter is not None:
  527. tarinfo = filter(tarinfo)
  528. if tarinfo is None:
  529. self._dbg(2, "tarfile: Excluded %r" % name)
  530. return
  531.  
  532. # Append the tar header and data to the archive.
  533. if tarinfo.isreg():
  534. with bltn_open(name, "rb") as f:
  535. self.addfile(tarinfo, f)
  536.  
  537. elif tarinfo.isdir():
  538. self.addfile(tarinfo)
  539. if recursive:
  540. for f in os.listdir(name):
  541. self.add(os.path.join(name, f), os.path.join(arcname, f),
  542. recursive, exclude, filter)
  543.  
  544. else:
  545. self.addfile(tarinfo)
  546.  
  547. def addfile(self, tarinfo, fileobj=None):
  548. """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is
  549. given, tarinfo.size bytes are read from it and added to the archive.
  550. You can create TarInfo objects using gettarinfo().
  551. On Windows platforms, `fileobj' should always be opened with mode
  552. 'rb' to avoid irritation about the file size.
  553. """
  554. self._check("aw")
  555.  
  556. tarinfo = copy.copy(tarinfo)
  557.  
  558. buf = tarinfo.tobuf(self.format, self.encoding, self.errors)
  559. self.fileobj.write(buf)
  560. self.offset += len(buf)
  561.  
  562. # If there's data to follow, append it.
  563. if fileobj is not None:
  564. copyfileobj(fileobj, self.fileobj, tarinfo.size)
  565. blocks, remainder = divmod(tarinfo.size, BLOCKSIZE)
  566. if remainder > 0:
  567. self.fileobj.write(NUL * (BLOCKSIZE - remainder))
  568. blocks += 1
  569. self.offset += blocks * BLOCKSIZE
  570.  
  571. self.members.append(tarinfo)
  572.  
  573. def extractall(self, path=".", members=None):
  574. """Extract all members from the archive to the current working
  575. directory and set owner, modification time and permissions on
  576. directories afterwards. `path' specifies a different directory
  577. to extract to. `members' is optional and must be a subset of the
  578. list returned by getmembers().
  579. """
  580. directories = []
  581.  
  582. if members is None:
  583. members = self
  584.  
  585. for tarinfo in members:
  586. if tarinfo.isdir():
  587. # Extract directories with a safe mode.
  588. directories.append(tarinfo)
  589. tarinfo = copy.copy(tarinfo)
  590. tarinfo.mode = 0700
  591. self.extract(tarinfo, path)
  592.  
  593. # Reverse sort directories.
  594. directories.sort(key=operator.attrgetter('name'))
  595. directories.reverse()
  596.  
  597. # Set correct owner, mtime and filemode on directories.
  598. for tarinfo in directories:
  599. dirpath = os.path.join(path, tarinfo.name)
  600. try:
  601. self.chown(tarinfo, dirpath)
  602. self.utime(tarinfo, dirpath)
  603. self.chmod(tarinfo, dirpath)
  604. except ExtractError, e:
  605. if self.errorlevel > 1:
  606. raise
  607. else:
  608. self._dbg(1, "tarfile: %s" % e)
  609.  
  610. def extract(self, member, path=""):
  611. """Extract a member from the archive to the current working directory,
  612. using its full name. Its file information is extracted as accurately
  613. as possible. `member' may be a filename or a TarInfo object. You can
  614. specify a different directory using `path'.
  615. """
  616. self._check("r")
  617.  
  618. if isinstance(member, basestring):
  619. tarinfo = self.getmember(member)
  620. else:
  621. tarinfo = member
  622.  
  623. # Prepare the link target for makelink().
  624. if tarinfo.islnk():
  625. tarinfo._link_target = os.path.join(path, tarinfo.linkname)
  626.  
  627. try:
  628. self._extract_member(tarinfo, os.path.join(path, tarinfo.name))
  629. except EnvironmentError, e:
  630. if self.errorlevel > 0:
  631. raise
  632. else:
  633. if e.filename is None:
  634. self._dbg(1, "tarfile: %s" % e.strerror)
  635. else:
  636. self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename))
  637. except ExtractError, e:
  638. if self.errorlevel > 1:
  639. raise
  640. else:
  641. self._dbg(1, "tarfile: %s" % e)
  642.  
  643. def extractfile(self, member):
  644. """Extract a member from the archive as a file object. `member' may be
  645. a filename or a TarInfo object. If `member' is a regular file, a
  646. file-like object is returned. If `member' is a link, a file-like
  647. object is constructed from the link's target. If `member' is none of
  648. the above, None is returned.
  649. The file-like object is read-only and provides the following
  650. methods: read(), readline(), readlines(), seek() and tell()
  651. """
  652. self._check("r")
  653.  
  654. if isinstance(member, basestring):
  655. tarinfo = self.getmember(member)
  656. else:
  657. tarinfo = member
  658.  
  659. if tarinfo.isreg():
  660. return self.fileobject(self, tarinfo)
  661.  
  662. elif tarinfo.type not in SUPPORTED_TYPES:
  663. # If a member's type is unknown, it is treated as a
  664. # regular file.
  665. return self.fileobject(self, tarinfo)
  666.  
  667. elif tarinfo.islnk() or tarinfo.issym():
  668. if isinstance(self.fileobj, _Stream):
  669. # A small but ugly workaround for the case that someone tries
  670. # to extract a (sym)link as a file-object from a non-seekable
  671. # stream of tar blocks.
  672. raise StreamError("cannot extract (sym)link as file object")
  673. else:
  674. # A (sym)link's file object is its target's file object.
  675. return self.extractfile(self._find_link_target(tarinfo))
  676. else:
  677. # If there's no data associated with the member (directory, chrdev,
  678. # blkdev, etc.), return None instead of a file object.
  679. return None
  680.  
  681. def _extract_member(self, tarinfo, targetpath):
  682. """Extract the TarInfo object tarinfo to a physical
  683. file called targetpath.
  684. """
  685. # Fetch the TarInfo object for the given name
  686. # and build the destination pathname, replacing
  687. # forward slashes to platform specific separators.
  688. targetpath = targetpath.rstrip("/")
  689. targetpath = targetpath.replace("/", os.sep)
  690.  
  691. # Create all upper directories.
  692. upperdirs = os.path.dirname(targetpath)
  693. if upperdirs and not os.path.exists(upperdirs):
  694. # Create directories that are not part of the archive with
  695. # default permissions.
  696. os.makedirs(upperdirs)
  697.  
  698. if tarinfo.islnk() or tarinfo.issym():
  699. self._dbg(1, "%s -> %s" % (tarinfo.name, tarinfo.linkname))
  700. else:
  701. self._dbg(1, tarinfo.name)
  702.  
  703. if tarinfo.isreg():
  704. self.makefile(tarinfo, targetpath)
  705. elif tarinfo.isdir():
  706. self.makedir(tarinfo, targetpath)
  707. elif tarinfo.isfifo():
  708. self.makefifo(tarinfo, targetpath)
  709. elif tarinfo.ischr() or tarinfo.isblk():
  710. self.makedev(tarinfo, targetpath)
  711. elif tarinfo.islnk() or tarinfo.issym():
  712. self.makelink(tarinfo, targetpath)
  713. elif tarinfo.type not in SUPPORTED_TYPES:
  714. self.makeunknown(tarinfo, targetpath)
  715. else:
  716. self.makefile(tarinfo, targetpath)
  717.  
  718. self.chown(tarinfo, targetpath)
  719. if not tarinfo.issym():
  720. self.chmod(tarinfo, targetpath)
  721. self.utime(tarinfo, targetpath)
  722.  
  723. #--------------------------------------------------------------------------
  724. # Below are the different file methods. They are called via
  725. # _extract_member() when extract() is called. They can be replaced in a
  726. # subclass to implement other functionality.
  727.  
  728. def makedir(self, tarinfo, targetpath):
  729. """Make a directory called targetpath.
  730. """
  731. try:
  732. # Use a safe mode for the directory, the real mode is set
  733. # later in _extract_member().
  734. os.mkdir(targetpath, 0700)
  735. except EnvironmentError, e:
  736. if e.errno != errno.EEXIST:
  737. raise
  738.  
  739. def makefile(self, tarinfo, targetpath):
  740. """Make a file called targetpath.
  741. """
  742. source = self.extractfile(tarinfo)
  743. try:
  744. with bltn_open(targetpath, "wb") as target:
  745. copyfileobj(source, target)
  746. finally:
  747. source.close()
  748.  
  749. def makeunknown(self, tarinfo, targetpath):
  750. """Make a file from a TarInfo object with an unknown type
  751. at targetpath.
  752. """
  753. self.makefile(tarinfo, targetpath)
  754. self._dbg(1, "tarfile: Unknown file type %r, " \
  755. "extracted as regular file." % tarinfo.type)
  756.  
  757. def makefifo(self, tarinfo, targetpath):
  758. """Make a fifo called targetpath.
  759. """
  760. if hasattr(os, "mkfifo"):
  761. os.mkfifo(targetpath)
  762. else:
  763. raise ExtractError("fifo not supported by system")
  764.  
  765. def makedev(self, tarinfo, targetpath):
  766. """Make a character or block device called targetpath.
  767. """
  768. if not hasattr(os, "mknod") or not hasattr(os, "makedev"):
  769. raise ExtractError("special devices not supported by system")
  770.  
  771. mode = tarinfo.mode
  772. if tarinfo.isblk():
  773. mode |= stat.S_IFBLK
  774. else:
  775. mode |= stat.S_IFCHR
  776.  
  777. os.mknod(targetpath, mode,
  778. os.makedev(tarinfo.devmajor, tarinfo.devminor))
  779.  
  780. def makelink(self, tarinfo, targetpath):
  781. """Make a (symbolic) link called targetpath. If it cannot be created
  782. (platform limitation), we try to make a copy of the referenced file
  783. instead of a link.
  784. """
  785. if hasattr(os, "symlink") and hasattr(os, "link"):
  786. # For systems that support symbolic and hard links.
  787. if tarinfo.issym():
  788. if os.path.lexists(targetpath):
  789. os.unlink(targetpath)
  790. os.symlink(tarinfo.linkname, targetpath)
  791. else:
  792. # See extract().
  793. if os.path.exists(tarinfo._link_target):
  794. if os.path.lexists(targetpath):
  795. os.unlink(targetpath)
  796. os.link(tarinfo._link_target, targetpath)
  797. else:
  798. self._extract_member(self._find_link_target(tarinfo), targetpath)
  799. else:
  800. try:
  801. self._extract_member(self._find_link_target(tarinfo), targetpath)
  802. except KeyError:
  803. raise ExtractError("unable to resolve link inside archive")
  804.  
  805. def chown(self, tarinfo, targetpath):
  806. """Set owner of targetpath according to tarinfo.
  807. """
  808. if pwd and hasattr(os, "geteuid") and os.geteuid() == 0:
  809. # We have to be root to do so.
  810. try:
  811. g = grp.getgrnam(tarinfo.gname)[2]
  812. except KeyError:
  813. g = tarinfo.gid
  814. try:
  815. u = pwd.getpwnam(tarinfo.uname)[2]
  816. except KeyError:
  817. u = tarinfo.uid
  818. try:
  819. if tarinfo.issym() and hasattr(os, "lchown"):
  820. os.lchown(targetpath, u, g)
  821. else:
  822. if sys.platform != "os2emx":
  823. os.chown(targetpath, u, g)
  824. except EnvironmentError, e:
  825. raise ExtractError("could not change owner")
  826.  
  827. def chmod(self, tarinfo, targetpath):
  828. """Set file permissions of targetpath according to tarinfo.
  829. """
  830. if hasattr(os, 'chmod'):
  831. try:
  832. os.chmod(targetpath, tarinfo.mode)
  833. except EnvironmentError, e:
  834. raise ExtractError("could not change mode")
  835.  
  836. def utime(self, tarinfo, targetpath):
  837. """Set modification time of targetpath according to tarinfo.
  838. """
  839. if not hasattr(os, 'utime'):
  840. return
  841. try:
  842. os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime))
  843. except EnvironmentError, e:
  844. raise ExtractError("could not change modification time")
  845.  
  846. #--------------------------------------------------------------------------
  847. def next(self):
  848. """Return the next member of the archive as a TarInfo object, when
  849. TarFile is opened for reading. Return None if there is no more
  850. available.
  851. """
  852. self._check("ra")
  853. if self.firstmember is not None:
  854. m = self.firstmember
  855. self.firstmember = None
  856. return m
  857.  
  858. # Read the next block.
  859. self.fileobj.seek(self.offset)
  860. tarinfo = None
  861. while True:
  862. try:
  863. tarinfo = self.tarinfo.fromtarfile(self)
  864. except EOFHeaderError, e:
  865. if self.ignore_zeros:
  866. self._dbg(2, "0x%X: %s" % (self.offset, e))
  867. self.offset += BLOCKSIZE
  868. continue
  869. except InvalidHeaderError, e:
  870. if self.ignore_zeros:
  871. self._dbg(2, "0x%X: %s" % (self.offset, e))
  872. self.offset += BLOCKSIZE
  873. continue
  874. elif self.offset == 0:
  875. raise ReadError(str(e))
  876. except EmptyHeaderError:
  877. if self.offset == 0:
  878. raise ReadError("empty file")
  879. except TruncatedHeaderError, e:
  880. if self.offset == 0:
  881. raise ReadError(str(e))
  882. except SubsequentHeaderError, e:
  883. raise ReadError(str(e))
  884. break
  885.  
  886. if tarinfo is not None:
  887. self.members.append(tarinfo)
  888. else:
  889. self._loaded = True
  890.  
  891. return tarinfo
  892.  
  893. #--------------------------------------------------------------------------
  894. # Little helper methods:
  895.  
  896. def _getmember(self, name, tarinfo=None, normalize=False):
  897. """Find an archive member by name from bottom to top.
  898. If tarinfo is given, it is used as the starting point.
  899. """
  900. # Ensure that all members have been loaded.
  901. members = self.getmembers()
  902.  
  903. # Limit the member search list up to tarinfo.
  904. if tarinfo is not None:
  905. members = members[:members.index(tarinfo)]
  906.  
  907. if normalize:
  908. name = os.path.normpath(name)
  909.  
  910. for member in reversed(members):
  911. if normalize:
  912. member_name = os.path.normpath(member.name)
  913. else:
  914. member_name = member.name
  915.  
  916. if name == member_name:
  917. return member
  918.  
  919. def _load(self):
  920. """Read through the entire archive file and look for readable
  921. members.
  922. """
  923. while True:
  924. tarinfo = self.next()
  925. if tarinfo is None:
  926. break
  927. self._loaded = True
  928.  
  929. def _check(self, mode=None):
  930. """Check if TarFile is still open, and if the operation's mode
  931. corresponds to TarFile's mode.
  932. """
  933. if self.closed:
  934. raise IOError("%s is closed" % self.__class__.__name__)
  935. if mode is not None and self.mode not in mode:
  936. raise IOError("bad operation for mode %r" % self.mode)
  937.  
  938. def _find_link_target(self, tarinfo):
  939. """Find the target member of a symlink or hardlink member in the
  940. archive.
  941. """
  942. if tarinfo.issym():
  943. # Always search the entire archive.
  944. linkname = "/".join(filter(None, (os.path.dirname(tarinfo.name), tarinfo.linkname)))
  945. limit = None
  946. else:
  947. # Search the archive before the link, because a hard link is
  948. # just a reference to an already archived file.
  949. linkname = tarinfo.linkname
  950. limit = tarinfo
  951.  
  952. member = self._getmember(linkname, tarinfo=limit, normalize=True)
  953. if member is None:
  954. raise KeyError("linkname %r not found" % linkname)
  955. return member
  956.  
  957. def __iter__(self):
  958. """Provide an iterator object.
  959. """
  960. if self._loaded:
  961. return iter(self.members)
  962. else:
  963. return TarIter(self)
  964.  
  965. def _dbg(self, level, msg):
  966. """Write debugging output to sys.stderr.
  967. """
  968. if level <= self.debug:
  969. print >> sys.stderr, msg
  970.  
  971. def __enter__(self):
  972. self._check()
  973. return self
  974.  
  975. def __exit__(self, type, value, traceback):
  976. if type is None:
  977. self.close()
  978. else:
  979. # An exception occurred. We must not call close() because
  980. # it would try to write end-of-archive blocks and padding.
  981. if not self._extfileobj:
  982. self.fileobj.close()
  983. self.closed = True
  984. # class TarFile

  f、shelve

  shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式

 import shelve
d = shelve.open('shelve_test') #打开一个文件
class Test(object):
def __init__(self,n):
self.n = n
t = Test(123)
t2 = Test(123334) name = ["alex","rain","test"]
d["test"] = name #持久化列表
d["t1"] = t #持久化类
d["t2"] = t2
d.close()

   aaarticlea/png;base64,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" alt="" width="476" height="99" />

  g、xml处理模块

  xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的接口还主要是xml。

  xml的格式如下,就是通过<>节点来区别数据结构的:

 <?xml version="1.0"?>
<data>
<country name="Liechtenstein">
<rank updated="yes">2</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country>
<country name="Singapore">
<rank updated="yes">5</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
</country>
<country name="Panama">
<rank updated="yes">69</rank>
<year>2011</year>
<gdppc>13600</gdppc>
<neighbor name="Costa Rica" direction="W"/>
<neighbor name="Colombia" direction="E"/>
</country>
</data>

  xml协议在各个语言里的都 是支持的,在python中可以用以下模块操作xml

 import xml.etree.ElementTree as ET
tree = ET.parse("xmltest.xml")
root = tree.getroot()
print(root.tag)
#遍历xml文档
for child in root:
print(child.tag, child.attrib)
for i in child:
print(i.tag,i.text)
#只遍历year 节点
for node in root.iter('year'):
print(node.tag,node.text)

  修改和删除xml文档内容

 import xml.etree.ElementTree as ET
tree = ET.parse("xmltest.xml")
root = tree.getroot() #修改
for node in root.iter('year'):
new_year = int(node.text) + 1
node.text = str(new_year)
node.set("updated","yes")
tree.write("xmltest.xml") #删除node
for country in root.findall('country'):
rank = int(country.find('rank').text)
if rank > 50:
root.remove(country)
tree.write('output.xml')

  自己创建xml文档

 import xml.etree.ElementTree as ET
new_xml = ET.Element("namelist")
name = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"})
age = ET.SubElement(name,"age",attrib={"checked":"no"})
sex = ET.SubElement(name,"sex")
sex.text = ''
name2 = ET.SubElement(new_xml,"name",attrib={"enrolled":"no"})
age = ET.SubElement(name2,"age")
age.text = ''
et = ET.ElementTree(new_xml) #生成文档对象
et.write("test.xml", encoding="utf-8",xml_declaration=True)
ET.dump(new_xml) #打印生成的格式

   h、ConfigParser模块

  用于生成和修改常见配置文档,当前模块的名称在 python 3.x 版本中变更为 configparser。

  来看一个好多软件的常见文档格式如下

 [DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes
[bitbucket.org]
User = hg
[topsecret.server.com]
Port = 50022
ForwardX11 = no

  如果想用python生成一个这样的文档怎么做呢?

 import configparser
config = configparser.ConfigParser()
config["DEFAULT"] = {'ServerAliveInterval': '',
'Compression': 'yes',
'CompressionLevel': ''}
config['bitbucket.org'] = {}
config['bitbucket.org']['User'] = 'hg'
config['topsecret.server.com'] = {}
topsecret = config['topsecret.server.com']
topsecret['Host Port'] = '' # mutates the parser
topsecret['ForwardX11'] = 'no' # same here
config['DEFAULT']['ForwardX11'] = 'yes'
with open('example.ini', 'w') as configfile:
config.write(configfile)

  写完了还可以再读出来

 >>> import configparser
>>> config = configparser.ConfigParser()
>>> config.sections()
[]
>>> config.read('example.ini')
['example.ini']
>>> config.sections()
['bitbucket.org', 'topsecret.server.com']
>>> 'bitbucket.org' in config
True
>>> 'bytebong.com' in config
False
>>> config['bitbucket.org']['User']
'hg'
>>> config['DEFAULT']['Compression']
'yes'
>>> topsecret = config['topsecret.server.com']
>>> topsecret['ForwardX11']
'no'
>>> topsecret['Port']
''
>>> for key in config['bitbucket.org']: print(key)
...
user
compressionlevel
serveraliveinterval
compression
forwardx11
>>> config['bitbucket.org']['ForwardX11']
'yes'

  I、hashlib模块  

  用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

 import hashlib
m = hashlib.md5()
m.update(b"Hello")
m.update(b"It's me")
print(m.digest())
m.update(b"It's been a long time since last time we ...") print(m.digest()) #2进制格式hash
print(len(m.hexdigest())) #16进制格式hash
'''
def digest(self, *args, **kwargs): # real signature unknown
""" Return the digest value as a string of binary data. """
pass def hexdigest(self, *args, **kwargs): # real signature unknown
""" Return the digest value as a string of hexadecimal digits. """
pass '''
import hashlib # ######## md5 ######## hash = hashlib.md5()
hash.update('admin')
print(hash.hexdigest()) # ######## sha1 ######## hash = hashlib.sha1()
hash.update('admin')
print(hash.hexdigest()) # ######## sha256 ######## hash = hashlib.sha256()
hash.update('admin')
print(hash.hexdigest()) # ######## sha384 ######## hash = hashlib.sha384()
hash.update('admin')
print(hash.hexdigest()) # ######## sha512 ######## hash = hashlib.sha512()
hash.update('admin')
print(hash.hexdigest())

  python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密

 import hmac
h = hmac.new('wueiqi')
h.update('hellowo')
print h.hexdigest()

  j、re模块

 '.'     默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
'^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$' 匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
'*' 匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 结果为['abb', 'ab', 'a']
'+' 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
'?' 匹配前一个字符1次或0次
'{m}' 匹配前一个字符m次
'{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
'|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
'(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c '\A' 只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的
'\Z' 匹配字符结尾,同$
'\d' 匹配数字0-9
'\D' 匹配非数字
'\w' 匹配[A-Za-z0-9]
'\W' 匹配非[A-Za-z0-9]
's' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t' '(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","").groupdict("city") 结果{'province': '', 'city': '', 'birthday': ''}

  H、Subprocess模块 

  常用subprocess方法示例

#执行命令,返回命令执行状态 , 0 or 非0
>>> retcode = subprocess.call(["ls", "-l"])

#执行命令,如果命令结果为0,就正常返回,否则抛异常
>>> subprocess.check_call(["ls", "-l"])
0

#接收字符串格式命令,返回元组形式,第1个元素是执行状态,第2个是命令结果 
>>> subprocess.getstatusoutput('ls /bin/ls')
(0, '/bin/ls')

#接收字符串格式命令,并返回结果
>>> subprocess.getoutput('ls /bin/ls')
'/bin/ls'

#执行命令,并返回结果,注意是返回结果,不是打印,下例结果返回给res
>>> res=subprocess.check_output(['ls','-l'])
>>> res
b'total 0\ndrwxr-xr-x 12 alex staff 408 Nov 2 11:05 OldBoyCRM\n'

#上面那些方法,底层都是封装的subprocess.Popen
poll()
Check if child process has terminated. Returns returncode

wait()
Wait for child process to terminate. Returns returncode attribute.

terminate() 杀掉所启动进程
communicate() 等待任务结束

stdin 标准输入

stdout 标准输出

stderr 标准错误

pid
The process ID of the child process.

#例子
>>> p = subprocess.Popen("df -h|grep disk",stdin=subprocess.PIPE,stdout=subprocess.PIPE,shell=True)
>>> p.stdout.read()
b'/dev/disk1 465Gi 64Gi 400Gi 14% 16901472 104938142 14% /\n'

 >>> subprocess.run(["ls", "-l"])  # doesn't capture output
drwxr-xr-x 3 gy staff 102 11 9 17:17 Applications
drwxr-xr-x@ 5 gy staff 170 11 9 19:56 Applications (Parallels)
drwxr-xr-x+ 19 gy staff 646 11 21 10:19 Desktop
drwx------+ 12 gy staff 408 11 14 15:39 Documents
drwx------+ 32 gy staff 1088 11 21 10:19 Downloads
drwx------@ 62 gy staff 2108 11 17 10:44 Library
>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1
>>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')

  调用subprocess.run(...)是推荐的常用方法,在大多数情况下能满足需求,但如果你可能需要进行一些复杂的与系统的交互的话,你还可以用subprocess.Popen(),语法如下:

p = subprocess.Popen("find / -size +1000000 -exec ls -shl {} \;",shell=True,stdout=subprocess.PIPE) print(p.stdout.read())

可用参数:

    • args:shell命令,可以是字符串或者序列类型(如:list,元组)
    • bufsize:指定缓冲。0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲
    • stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
    • preexec_fn:只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用
    • close_sfs:在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道。
      所以不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。
    • shell:同上
    • cwd:用于设置子进程的当前目录
    • env:用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。
    • universal_newlines:不同系统的换行符不同,True -> 同意使用 \n
    • startupinfo与createionflags只在windows下有效
      将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等

终端输入的命令分为两种:

    • 输入即可得到输出,如:ifconfig
    • 输入进行某环境,依赖再输入,如:python

需要交互的命令示例

 import subprocess

 obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
obj.stdin.write('print 1 \n ')
obj.stdin.write('print 2 \n ')
obj.stdin.write('print 3 \n ')
obj.stdin.write('print 4 \n ') out_error_list = obj.communicate(timeout=10)
print out_error_list

subprocess实现sudo 自动输入密码

 import subprocess

 def mypass():
mypass = '' #or get the password from anywhere
return mypass echo = subprocess.Popen(['echo',mypass()],
stdout=subprocess.PIPE,
) sudo = subprocess.Popen(['sudo','-S','iptables','-L'],
stdin=echo.stdout,
stdout=subprocess.PIPE,
) end_of_pipe = sudo.stdout print "Password ok \n Iptables Chains %s" % end_of_pipe.read()

最常用的匹配语法

 re.match 从头开始匹配
re.search 匹配包含
re.findall 把所有匹配到的字符放到以列表中的元素返回
re.splitall 以匹配到的字符当做列表分隔符
re.sub 匹配字符并替换

  反斜杠的困扰
  与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用
编程语言表示的正则表达式里将需要4个反斜杠"\\\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成
一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。同样,匹配一个数字的"\\d"可以写成
r"\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。

  仅需轻轻知道的几个匹配模式

 re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
M(MULTILINE): 多行模式,改变'^'和'$'的行为(参见上图)
S(DOTALL): 点任意匹配模式,改变'.'的行为

【python之旅】python的模块的更多相关文章

  1. python之旅:常用模块

    一.time与datetime模块 在Python中,通常有这几种方式来表示时间 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1号00:00:00开始按照秒计算的偏移量.我们 ...

  2. Python之旅Day6 模块应用

    time datetime random os sys shutil pickle json shelv xml configparser hashlib subprocess logging re ...

  3. Python之旅Day4 闭包函数 模块及模块倒入

    闭包函数 闭包函数就是在内部函数当中有对外部函数名字的引用 ###代码示例1### def f1(): x =1 def f2(): print(x) return f2 f=f1() f() ### ...

  4. 【Python之旅】第六篇(七):开发简易主机批量管理工具

    [Python之旅]第六篇(七):开发简易主机批量管理工具 python 软件开发 Paramiko模块 批量主机管理 摘要: 通过前面对Paramiko模块的学习与使用,以及Python中多线程与多 ...

  5. 开始 Python 之旅

    开始 Python 之旅 课程来源 本课程基于 Python for you and me 教程翻译制作,其中参考了 Python tutorial 和 The Python Standard Lib ...

  6. Python之旅Day1 数据类型初识(数字|字符串|列表|数据运算) 编码 表达式(if...else|for|while)

    初识PYTHON Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum(吉多·范罗苏姆)于 ...

  7. Python全栈开发【模块】

    Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...

  8. Python 学习笔记(6)--常用模块(2)

    一.下载安装 下载安装有两种方式: yum\pip\apt-get 或者源码 下载源码 解压源码 进入目录 编译源码 python setup.py build 安装源码 python setup.p ...

  9. python学习笔记之常用模块(第五天)

    参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...

随机推荐

  1. Java 抽象类与接口总结

    一.为什么要使用抽象类?有什么好处? 抽象类是通用接口.不同的子类可以用不同的方法表示此接口.通用接口建立起一种基本形式,以此表示所有子类的共同部分. 必须覆写父类abstract抽象的方法  含有抽 ...

  2. Linux主机安全配置的几个脚本【转载】

    标签:linux Linux主机安全配置的几个脚本 职场 休闲原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://hx100.blog ...

  3. DS18B20测温

    项目需要实现分布式大规模测温,需要52个测温点,采样DS18B20进行设计. 30cm一个点,一共8个点串联.采用国标单芯单股纯铜硬线BV0.5做导线,测试一会儿正常,一会儿不正常.后面换线了,测试正 ...

  4. Java高级--Java线程运行栈信息的获取 getStackTrace()

    我们在Java程序中使用日志功能(JDK Log或者Log4J)的时候,会发现Log系统会自动帮我们打印出丰富的信息,格式一般如下:为了免去解析StackTrace字符串的麻烦,JDK1.4引入了一个 ...

  5. Java基础知识强化之集合框架笔记48:产生10个1~20之间的随机数(要求:随机数不能重复) 简洁版

    1. 编写一个程序,获取10个1至20的随机数,要求随机数不能重复. 分析:  A: 创建随机数对象  B: 创建一个HashSet集合  C: 判断集合的长度是不是小于10    是:就创建一个随机 ...

  6. ubuntu 下编译安装 mysql php nginx 及常见错误 (持续添加)

    mysql mysql 可以使用mysql 官方提供的apt源进行安装 参见这里 php 安装前先安装一些常见库 sudo apt-get install libpng16-16 libpng16-d ...

  7. dbartisan下载地址

    http://downloads.embarcadero.com/free/dbartisan

  8. 构建可克隆的对象(ICloneable)

    ICloneable接口 如果想使自己的自定义类型支持向调用方返回自身同样副本的能力,需要实现标准ICloneable接口. namespace System { // // 摘要: // Suppo ...

  9. 文件图标css样式

    .list-list .ico-bookfolder { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEU ...

  10. json 是什么

    怎么学习一个知识? 首先要提出几个问题,目前认为json是个什么,json是谁创造的,为什么而出现的,但是目前仅有很长时间之前别人直接告诉我的,json用来存数据的,对于使用也忘记的差不多了,所以现在 ...