Python3操纵压缩文件

tarfile库


tarfile库用于控制tar命令压缩的压缩文件,这里来看一下有哪些值得学习的函数:

  • 首先是tarfile.open(path),用于打开一个压缩文件:
1
2
3
4
>>> import tarfile
>>> tar = tarfile.open('test.gz')
>>> tar
<tarfile.TarFile object at 0x102db5da0>
  • 你可以用is_tarfile(filename)来确定一个文件是不是tar类型:
1
2
>>> tarfile.is_tarfile('test.gz')
True
  • 获得压缩文件里的信息 可以使用getnames(),getmembers(),list等函数获得信息,具体的效果看下面:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
>>> tar.getnames()
['./._数码管.png', '数码管.png', './._四角按键.png', '四角按键.png', './._六脚自锁开关.jpg', '六脚自锁开关.jpg']
>>> tar.getmembers()
[<TarInfo './._数码管.png' at 0x102895f20>, <TarInfo '数码管.png' at 0x102e18048>, <TarInfo './._四角按键.png' at 0x102e18110>, <TarInfo '四角按键.png' at 0x102e181d8>, <TarInfo './._六脚自锁开关.jpg' at 0x102e182a0>, <TarInfo '六脚自锁开关.jpg' at 0x102e18368>]
>>> tar.list()
?rw-r--r-- visualgmq/staff        531 2018-10-31 19:52:00 ./._数码管.png 
?rw-r--r-- visualgmq/staff     180999 2018-10-31 19:52:00 数码管.png 
?rw-r--r-- visualgmq/staff        423 2018-10-30 17:27:12 ./._四角按键.png 
?rw-r--r-- visualgmq/staff      14592 2018-10-30 17:27:12 四角按键.png 
?rw-r--r-- visualgmq/staff        266 2018-10-30 17:35:38 ./._六脚自锁开关.jpg 
?rw-r--r-- visualgmq/staff       3436 2018-10-30 17:35:38 六脚自锁开关.jpg 

这里显示我的压缩文件里面有三个图片,分别是“数码管.png”,"六角自锁开关.jpg"和"四角按键.png"。

  • 解压缩文件 可以通过tarfile.extract()和tarfile.extarctall()来实现解压缩。前者是解压缩制定文件,后者会全部解压缩。你也可以给出解压缩的目的地。
1
>>> tar.extractall()

这样的话文件会全部解药到当前路径下。

1
>>> tar.extractall('图片')

这样会在当前路径下创建“图片”文件夹,然后解压到里面去。

1
>>> tar.extract('四角按键.png')

这里制定了解压哪一个文件

1
>>> tar.extract('四角按键.png','test')

这里制定了解压到哪一个文件夹中。

你也可以通过遍历tar来获得tarinfo:

for tarinfo in tar:

或者使用next方法来返回当前位置的下一个元素的tarinfo:

1
>>> tarinfo = tar.next()

这里tarinfo是压缩包里面元素的信息,有下面的属性:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
>>> for tarinfo in tar:
...     print(tarinfo.name) #name属性
... 
./._数码管.png
数码管.png
./._四角按键.png
四角按键.png
./._六脚自锁开关.jpg
六脚自锁开关.jpg

>>> for tarinfo in tar:
...     print(tarinfo.size) #size属性
... 
531
180999
423
14592
266
3436

>>> for tarinfo in tar:
...     print(tarinfo.mtime) #最近一次的修改时间
... 
1540986720.5672143
1540986720.5672143
1540891632.1421418
1540891632.1421418
1540892138.9489677
1540892138.9489677

>>>for tarinfo in tar:
...     print(tarinfo.mode) #文件权限
... 

>>> for tarinfo in tar:
...     print(tarinfo.gid,tarinfo.uid) #Group ID & User ID
... 
20 501
20 501
20 501
20 501
20 501
20 501

>>> for tarinfo in tar:
...     print(tarinfo.uname,tarinfo.gname) #User name & Group name
... 
visualgmq staff
visualgmq staff
visualgmq staff
visualgmq staff
visualgmq staff
visualgmq staff

还有一些方法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
>>> for tarinfo in tar:
...     print(tarinfo.isfile(),tarinfo.isdir()) #是否是文件,是否是目录(其中isfile()可以被isreg()替换)
... 
True False
True False
True False
True False
True False
True False

>>> for tarinfo in tar:
...     print(tarinfo.issym(),tarinfo.islnk()) #是否是字符链接,是否是硬链接
... 
False False
False False
False False
False False
False False
False False

>>> for tarinfo in tar:
...     print(tarinfo.ischr(),tarinfo.isblk())  #是否是字符设备,是否是块设备
... 
False False
False False
False False
False False
False False
False False

最后用完了tar需要关闭:

1
tar.close()

你也可以创建自己的压缩包,在taropen的时候指定压缩方式即可: ```python >>> tar = tarfile.open("test.gz",'w:gz') #可写的gz压缩格式 ``` 除了'gz'表示gzip格式外,还有bz2(bzip2格式),xz(lzma格式)。

然后可以使用add方法来添加文件啦:

1
2
3
4
5
6
>>> tar.add('./test/数码管.png')
>>> tar.getnames()
['./test/数码管.png']
>>> tar.add('./test/四角按键.png')
>>> tar.getnames()
['./test/数码管.png', './test/四角按键.png']

你也可以使用addfile()来添加文件,不过这个函数的参数是tarinfo对象.



zipfile库

zipfile库是用来对zip文件进行操作的库。 zipfile本身是没有open函数的,你必须声明zipfile对象才可以对zip文件进行操作:

1
2
3
>>> zf = zipfile.ZipFile('test.zip','r')
>>> zf
<zipfile.ZipFile filename='test.zip' mode='r'>

这里如果省略第二个参数默认为r(只读)


接下来看看有哪些可以获得信息的方法: ```python >>> zf.namelist() ['单片机/数码管.png', '单片机/六脚自锁开关.jpg', '单片机/四角按键.png'] >>> zf.infolist() [, , ] >>> zf.filename 'test.zip' ```
抽取的方法和tarfile一样: ```python >>> zf.extract('单片机/数码管.png') '/Users/visualgmq/Desktop/单片机/数码管.png' >>> zf.extractall() ``` zip文件还有一个特别的地方是可以设置解压密码,没有这个密码的话是无法操作和解压里面的内容的: ```python >>> zf.setpassword(bytes("this is a zip",'ascii')) ``` 这里setpassword只能够给入bytes作为密码,我们这里使用bytes的构造函数将string编程bytes。语法是bytes(data,encode_type),其中encode_type表示以什么方式转码,这里转换成ascii码。

那么我们在抽取的时候就需要指定pwd参数来给出密码:

zf.extractall(pwd='this is a zip')

你还可以使用read函数来读取一个元素,返回其字节信息: ```python >>> zf.read('单片机/六脚自锁开关.jpg') b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x01*\x00\x00\x00\x98\x08\x02\x00\x00\x00\xdc-3\xb2\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\tpHYs\x00\x00\x0e\...... ```

或者使用write函数增加一个文件:

1
>>> zf.write('test.png')

使用完之后要关闭:

1
zf.close()

和tarinfo一样,我们也有zipinfo。你可以通过两种方式来获得zipinfo: ```python >>> zf.infolist() #返回所有元素的zipinfo [, , ] >>> zf.getinfo('单片机/数码管.png') #返回单个元素的zipinfo ```
那么我们来看看zipinfo有什么有用的属性; ```python >>> info.filename #元素名称 '单片机/数码管.png' >>> info.date_time #最后修改的时间 (2018, 10, 31, 19, 52, 0) >>> info.compress_type #压缩的方式 0 >>> info.comment #这个元素的注释 b'' >>> info.create_system #是从那个系统创建的 3 >>> info.create_version #创建时zip的版本 20 >>> info.extract_version #抽取出来需要的最低zip版本 20 >>> info.CRC #CRC编码 2392735222 >>> info.compress_size #压缩之后的大小 180999 >>> info.file_size #压缩之前(原文件)大小 180999 ``` 还有一个is_dir()方法: ```python >>> info.is_dir() #是不是目录 False ``` *** *** 除了这两个库还有gzip,bz2,lzma三个库,但是有了这两个库基本上可以搞定所有问题了,就不再学习那三个库了。
updatedupdated2023-06-082023-06-08