Python
下使用
tarfile
模块来实现文件归档压缩与解压
1.压缩,创建tar.gz包
#!/usr/bin/env python
import os
import tarfile
#创建压缩包名
tar = tarfile.open("/tmp/tartest.tar.gz","w:gz")
#创建压缩包
for root,dir,files in os.walk("/tmp/tartest"):
for file in files:
fullpath = os.path.join(root,file)
tar.add(fullpath)
tar.close()
2.解压
tar.gz
包
#!/usr/bin/env python
import tarfile
tar = tarfile.open(“/tmp/tartest.tar.gz”)
names = tar.getnames()
for name in names:
tar.extract(name,path=”/tmp”)
tar.close()
import zipfile
file = zipfile.ZipFile("samples/sample.zip", "r") # 打开压缩包
# 列出压缩包内文件名
for name in file.namelist():
print name,
# 列出压缩包内文件信息
for info in file.infolist():
print info.filename, info.date_time, info.file_size
sample.txt sample.jpg
sample.txt (1999, 9, 11, 20, 11, 8) 302
sample.jpg (1999, 9, 18, 16, 9, 44) 4762
---------------------------------------------------------
从 ZIP 文件中读取数据
调用 read 方法就可以从 ZIP 文档中读取数据. 它接受一个文件名作为参数, 返回字符串
---------------------------------------------------------
import zipfile
file = zipfile.ZipFile("samples/sample.zip", "r") # 打开压缩包
for name in file.namelist(): #列出压缩包内文件名称
data = file.read(name) # 读取文件到data
print name, len(data), repr(data[:10]) # 输出文件对象数量及内容
sample.txt 302 'We will pe'
sample.jpg 4762 '\377\330\377\340\000\020JFIF'
---------------------------------------------------------
ZIP 文件写入数据
使用 zipfile 模块将文件储存在 ZIP 文件里
向压缩档加入文件很简单, 将文件名, 文件在 ZIP 档中的名称传递给 write 方法即可.
write 方法的第三个可选参数用于控制是否使用压缩.默认为 zipfile.ZIP_STORED , 意味着只是将数据储存在档案里而不进行任何压缩.
如果安装了 zlib 模块, 那么就可以使用 zipfile.ZIP_DEFLATED 进行压缩.
---------------------------------------------------------
import zipfile
import glob, os
file = zipfile.ZipFile("test.zip", "w") # 打开压缩包,写方式
for name in glob.glob("samples/*"): # 匹配samples目录下所有文件
file.write(name, os.path.basename(name), zipfile.ZIP_DEFLATED) #将文件写入到压缩包内
file.close()
file = zipfile.ZipFile("test.zip", "r")
for info in file.infolist():
print info.filename, info.date_time, info.file_size, info.compress_size
sample.wav (1999, 8, 15, 21, 26, 46) 13260 10985
sample.jpg (1999, 9, 18, 16, 9, 44) 4762 4626
sample.au (1999, 7, 18, 20, 57, 34) 1676 1103
...
---------------------------------------------------------
使用 zipfile 模块在 ZIP 文件中储存字符串
---------------------------------------------------------
import zipfile
import glob, os, time
file = zipfile.ZipFile("test.zip", "w") # 打开压缩包,写方式
now = time.localtime(time.time())[:6] # 获取当前时间 (2012, 2, 3, 16, 58, 39)
for name in ("life", "of", "brian"):
info = zipfile.ZipInfo(name)
info.date_time = now
info.compress_type = zipfile.ZIP_DEFLATED
file.writestr(info, name*1000)
file.close()
# open the file again, to see what's in it
file = zipfile.ZipFile("test.zip", "r")
for info in file.infolist():
print info.filename, info.date_time, info.file_size, info.compress_size
life (2000, 12, 1, 0, 12, 1) 4000 26
of (2000, 12, 1, 0, 12, 1) 2000 18
brian (2000, 12, 1, 0, 12, 1) 5000 31
---------------------------------------------------------
案例分析
---------------------------------------------------------
import zipfile
z = zipfile.ZipFile(filename, 'r') # 这里的第二个参数用
r表示是读取zip文件,w是创建一个zip文件
for f in z.namelist():
print f
---------------------------------------------------------
import zipfile
z = zipfile.ZipFile(filename, 'r')
for i in z.infolist():
print i.file_size, i.header_offset
---------------------------------------------------------
import zipfile
z = zipfile.ZipFile(filename, 'r')
print z.read(z.namelist()[0])
---------------------------------------------------------
import zipfile, os
z = zipfile.ZipFile(filename, 'w') # 注意这里的第二个参数是w,这里的filename是压缩包的名字
#假设要把一个叫testdir中的文件全部添加到压缩包里(这里只添加一级子目录中的文件):
if os.path.isdir(testdir):
for d in os.listdir(testdir):
z.write(testdir+os.sep+d)
# close() 是必须调用的!
z.close()
tar打包
在写打包代码的过程中,使用tar.add()增加文件时,会把文件本身的路径也加进去,加上arcname就能根据自己的命名规则将文件加入tar包
打包代码:
Python代码
-
-
-
import
tarfile
-
import
os
-
import
time
-
-
start = time.time()
-
tar=tarfile.open(
'/path/to/your.tar,'
w')
-
for
root,dir,files
in
os.walk(
'/path/to/dir/'
):
-
for
file
in
files:
-
fullpath=os.path.join(root,file)
-
tar.add(fullpath,arcname=file)
-
tar.close()
-
print
time.time()-start
tar解包
tar解包也可以根据不同压缩格式来解压。
Python代码
-
-
-
import
tarfile
-
import
time
-
-
start = time.time()
-
t = tarfile.open(
"/path/to/your.tar"
,
"r:"
)
-
t.extractall(path =
'/path/to/extractdir/'
)
-
t.close()
-
print
time.time()-start
上面的代码是解压所有的,也可以挨个起做不同的处理,但要如果tar包内文件过多,小心内存哦~
Python代码
-
tar = tarfile.open(filename,
'r:gz'
)
-
for
tar_info
in
tar:
-
file = tar.extractfile(tar_info)
-
do_something_with(file)