一.zip压缩模块
zipfile 后缀是zip
import zipfile
1.压缩文件
(1)创建压缩包
zf = zipfile.ZipFile("ceshi0512.zip","w",zipfile.ZIP_DEFLATED)
(2)把文件写入到压缩包中
# write(路径,别名)
zf.write(r"E:python30day17ceshi1001.txt","1.txt")
zf.write(r"E:python30day17ceshi1002.txt","2.txt")
# 可以允许临时创建一个文件夹tmp
zf.write(r"E:python30day17ceshi1003.py","/tmp/3.py")
(3)关闭压缩文件
zf.close()
2.解压文件
zf = zipfile.ZipFile("ceshi0512.zip","r")
# ./代表相对于当前路径
# zf.extractall("./ceshi300")
# zf.extract(文件,文件夹)
zf.extract("1.txt","./ceshi400")
zf.close()
3.追加文件
zf = zipfile.ZipFile("ceshi0512.zip","a",zipfile.ZIP_DEFLATED)
zf.write(r"E:python30day17ceshi1004.php","4.py")
zf.close()
# 使用with语法进行优化 (可以省略close操作) 推荐
with zipfile.ZipFile("ceshi0512.zip","a",zipfile.ZIP_DEFLATED) as zf:
zf.write(r"E:python30day17ceshi1004.php","6666.py")
4.查看文件
with zipfile.ZipFile("ceshi0512.zip","r",zipfile.ZIP_DEFLATED) as zf:
lst = zf.namelist()
print(lst)
二.tarfil压缩模块
.tar .tar.gz .tar.bz2
import tarfile
官方说法, .tar.bz2的压缩算法,包的大小最小
1.压缩文件
(1)创建tar压缩包
tf = tarfile.open("ceshi0513.tar","w",encoding="utf-8")
(2)添加文件打包
# add(路径,别名)
tf.add(r"E:python30day17ceshi1001.txt","1.txt")
tf.add(r"E:python30day17ceshi1002.txt","222")
tf.add(r"E:python30day17ceshi1003.py","/tmp/3.py")
(3)关闭文件
tf.close()
(4) .tar.gz 的压缩包
tf = tarfile.open("ceshi0514.tar.gz","w:gz",encoding="utf-8")
tf.add(r"E:python30day17ceshi1001.txt","1.txt")
tf.add(r"E:python30day17ceshi1002.txt","222")
tf.add(r"E:python30day17ceshi1003.py","/tmp/3.py")
tf.close()
(5) .tar.bz2 的压缩包(理论上压缩出来的包最小)
tf = tarfile.open("ceshi0515.tar.bz2","w:bz2",encoding="utf-8")
tf.add(r"E:python30day17ceshi1001.txt","1.txt")
tf.add(r"E:python30day17ceshi1002.txt","222")
tf.add(r"E:python30day17ceshi1003.py","/tmp/3.py")
tf.close()
2.解压文件
tf = tarfile.open("ceshi0514.tar.gz","r",encoding="utf-8")
#extractall(路径) 解压所有文件到某个路径下
# tf.extractall("ceshi500")
# extract(文件,路径) 解压指定的某个文件到某个路径下
tf.extract("222","ceshi600")
tf.close()
3.追加文件
"""只能对w模式下的打包进行追加,其他的模式不行"""
with tarfile.open("ceshi0513.tar","a",encoding="utf-8") as tf:
tf.add(r"E:python30day17ceshi1004.php","4.php")
# 对于tar.gz 或者 tar.bz2已经压缩过的包无法追加文件
"""
with tarfile.open("ceshi0514.tar.gz","a",encoding="utf-8") as tf:
tf.add(r"E:python30day17ceshi1004.php","4.php")
"""
4.查看压缩包
with tarfile.open("ceshi0513.tar","r",encoding="utf-8") as tf:
lst = tf.getnames()
print(lst)
5.对于tarfile不能追加文件的bug进行优化
tarfil的解决方法,文件或者文件夹都可以通过add放到压缩包中
1)先解压原来的压缩包
2)把要追加的内容放进去
3)过滤数据,重新打包
import os
pathvar = os.getcwd()
print(pathvar) # E:python30day17
# 压缩包的路径
pathvar1 = os.path.join(pathvar,"ceshi0515.tar.bz2")
print(pathvar1)
# 解压文件夹的路径
pathvar2 = os.path.join(pathvar,"ceshi0515")
print(pathvar2)
# 1.先解压压缩包
with tarfile.open(pathvar1,"r",encoding="utf-8") as tf:
tf.extractall(pathvar2)
# 2.把追加的内容放进来
import shutil
shutil.copy(r"E:python30day17ceshi1004.php",pathvar2)
# 3.过滤数据,重新打包
"""过滤掉222这个文件,剩下的文件重新打包"""
lst = os.listdir(pathvar2)
print(lst) # ['1.txt', '222', '4.php', 'tmp']
with tarfile.open(pathvar1,"w:bz2",encoding="utf-8") as tf:
for i in lst:
# print(i)
pathnew = os.path.join(pathvar2,i)
print(pathnew)
# add(路径,别名)
if i != "222":
tf.add(pathnew,i)
三.模块与包
模块部分
1.import导入模块
导入一次,终身受益,不会重复导入
1)模块.变量(mymodule.xboy)
2)模块.函数(mymodule.dog() )
3)模块.类(mymodule.Car().color )
2.导入任意路径下的模块
默认只能导入当前文件所在的这个文件夹下的所有模块
通过sys.path可以导入任意路径下的模块
导入模块时->会去找sys.path这个列表里的路径,如果找到就导入,找不到就报错
通过append可以在列表里追加路径,来实现导入的功能
可以给模块起别名(import mymodule2 as m2)
3.from...import...可以导入单个,多个,或者所有(用*来表示)
可以定制 *号的范围 ( ___ all ___ =[ ] )
4.__ name __
返回模块名字的魔术属性__ name __
如果当前文件是直接运行的,返回__ main__
如果当前文件是间接导入的,返回当前文件名(模块名)
包的部分
1.import导入包
1)文件就是一个模块,文件夹就是一个包
文件夹里面可以有很多的文件,就相当于包里面有很多的模块
2)__ init __.py 对包(文件夹)进行初始化的脚本文件
导入包的时候,系统自动调用__ init__ 文件,当前文件夹进行初始化,实际上就是对init中的文件属性进行导入
3)这个包下的其他模块可以通过初始换文件间接导入
(1) 导入包,通过init文件初始换,默认引入init文件中的所有属性
# import package1
# print(package1.ceshi003)
(2)引入包当中具体的一个模块
# 方法一
# import package1.mypath
# package1.mypath.join()
# 起别名
# import package1.mypath as pm
# pm.join()
# 方法二 (通过__init__间接导入,更加简洁)
# import package1
# package1.mypath.join()
(3)用 from...import 从包导入成员(落脚点在模块或者成员)
# 1.包.模块.成员
# from package1 import ceshi001
# print(ceshi001)
# from package1 import mypath
# mypath.getsize()
# from package1.mypath import getsize
# getsize()
# 2.起别名
# from package1.mypath import ceshi004 as c4 , ceshi005 as c5
# print(c4 , c5)
# 3.导入所有
"""
from package1 import *
# print(ceshi002)
print(ceshi001)
"""
(4)单入口模式(相对路径导入)
分模块不能单独进行调用,统一由主文件main进行调用
模块之间的互相嵌套导入,使用相对路径实现
单入口文件必须和包在同一层级,包里面可以含有各种包和模块