python学习第17天

.zip压缩模块

zipfile 后缀是zip

import zipfile

1.压缩文件

(1)创建压缩包

zf = zipfile.ZipFile("ceshi0512.zip","w",zipfile.ZIP_DEFLATED)

(2)把文件写入到压缩包中

# write(路径,别名)
zf.write(r"E:\python30\day17\ceshi100\1.txt","1.txt")
zf.write(r"E:\python30\day17\ceshi100\2.txt","2.txt")
# 可以允许临时创建一个文件夹tmp
zf.write(r"E:\python30\day17\ceshi100\3.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:\python30\day17\ceshi100\4.php","4.py")
zf.close()
# 使用with语法进行优化 (可以省略close操作) 推荐
with zipfile.ZipFile("ceshi0512.zip","a",zipfile.ZIP_DEFLATED) as zf:
	zf.write(r"E:\python30\day17\ceshi100\4.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:\python30\day17\ceshi100\1.txt","1.txt")
tf.add(r"E:\python30\day17\ceshi100\2.txt","222")
tf.add(r"E:\python30\day17\ceshi100\3.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:\python30\day17\ceshi100\1.txt","1.txt")
tf.add(r"E:\python30\day17\ceshi100\2.txt","222")
tf.add(r"E:\python30\day17\ceshi100\3.py","/tmp/3.py")
tf.close()

(5) .tar.bz2 的压缩包(理论上压缩出来的包最小)

tf = tarfile.open("ceshi0515.tar.bz2","w:bz2",encoding="utf-8")
tf.add(r"E:\python30\day17\ceshi100\1.txt","1.txt")
tf.add(r"E:\python30\day17\ceshi100\2.txt","222")
tf.add(r"E:\python30\day17\ceshi100\3.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:\python30\day17\ceshi100\4.php","4.php")

# 对于tar.gz  或者 tar.bz2已经压缩过的包无法追加文件
"""
with tarfile.open("ceshi0514.tar.gz","a",encoding="utf-8") as tf:
	tf.add(r"E:\python30\day17\ceshi100\4.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:\python30\day17

# 压缩包的路径
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:\python30\day17\ceshi100\4.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进行调用
模块之间的互相嵌套导入,使用相对路径实现
单入口文件必须和包在同一层级,包里面可以含有各种包和模块

猜你喜欢

转载自www.cnblogs.com/yunchao-520/p/12933612.html