码迷,mamicode.com
首页 > 编程语言 > 详细

Python之tarfile模块的使用

时间:2020-01-09 14:43:24      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:dir   修改时间   nim   usr   增加   修改文件名   form   hid   解压   

1、判断是否是tar文件的示例

技术图片
#!/usr/bin/env python3
# encoding: utf-8

import tarfile

filename_list = [REME.txt, example.bz2, tarDir.tar, content.txt]
for filename in filename_list:
    try:
        print({:>15} {}.format(filename, tarfile.is_tarfile(filename)))
    except IOError as err:
        print({:>15} {}.format(filename, err))
tarfile_is_tarfile.py

 运行效果

[root@ mnt]# python3 tarfile_is_tarfile.py 
       REME.txt [Errno 2] No such file or directory: REME.txt
    example.bz2 False
     tarDir.tar True
    content.txt False

 2、获取tar文件里面所有的文件名

技术图片
#!/usr/bin/env python3
# encoding: utf-8

import tarfile

with tarfile.open(tarDir.tar, r) as t:
    print(t.getnames())
tarfile_getnames.py

 运行效果

[root@ mnt]# python3 tarfile_getnames.py 
[content.txt, example.bz2, tarDir, tarDir/lines.bz2]

  3、获取tar文件里面所有的文件名、大小、模式等

技术图片
#!/usr/bin/env python3
# encoding: utf-8

import tarfile
import time

with tarfile.open(tarDir.tar, r) as t:
    for member_info in t.getmembers():
        print(member_info.name)
        print( 修改时间:, time.ctime(member_info.mtime))
        print( 模式:, member_info.mode)
        print( 类型:, member_info.type)
        print( 大小:, member_info.size, bytes)
tarfile_getmembers.py

运行效果

[root@ mnt]# python3 tarfile_getmembers.py 
content.txt
 修改时间: Wed Dec 25 14:16:23 2019
 模式: 420
 类型: b0
 大小: 336 bytes
example.bz2
 修改时间: Mon Jan  6 00:06:31 2020
 模式: 420
 类型: b0
 大小: 65 bytes
tarDir
 修改时间: Thu Jan  9 10:29:51 2020
 模式: 493
 类型: b5
 大小: 0 bytes
tarDir/lines.bz2
 修改时间: Sun Jan  5 23:43:05 2020
 模式: 420
 类型: b0
 大小: 88 bytes

 4、获取tar文件里面所有的文件名、大小、模式等,当文件不存在的时候,异常处理的机制示例

技术图片
#!/usr/bin/env python3
# encoding: utf-8

import tarfile

with tarfile.open(tarDir.tar, r) as t:
    for filename in [example.bz2, test]:
        try:
            info = t.getmember(filename)
        except KeyError:
            print({} 文件不存在.format(filename))
        else:
            print(文件名:{} 大小:{} bytes.format(info.name, info.size))
tarfile_getmember.py

运行效果

[root@ mnt]# python3 tarfile_getmember.py 
文件名:example.bz2 大小:65 bytes
test 文件不存在

 5、读取tar里面的文件数据内容

技术图片
#!/usr/bin/env python3
# encoding: utf-8

import tarfile

with tarfile.open(tarDir.tar, r) as t:
    for filename in [example.bz2, test]:
        try:
            f = t.extractfile(filename)
        except KeyError:
            print({} 文件不存在,无法归档.format(filename))
        else:
            print(文件名:{} 读到的内容:{}.format(filename, f.read().decode(utf-8)))
tarfile_extractfile.py

运行效果

[root@ mnt]# python3 tarfile_getmember.py 
文件名:content.txt 读到的内容:bLorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec\negestas, enim et consectetuer ullamcorper, lectus ligula rutrum leo, a\nelementum elit tortor eu quam. Duis tincidunt nisi ut ante. Nulla\nfacilisi. Sed tristique eros eu libero. Pellentesque vel arcu. Vivamus\npurus orci, iaculis ac, suscipit sit amet, pulvinar eu,\nlacus.\n\n
test 文件不存在,无法归档

6、tart简单解压示例

技术图片
#!/usr/bin/env python3
# encoding: utf-8

import os
import tarfile

dir_name = outdir
os.mkdir(dir_name)
with tarfile.open(tarDir.tar, r) as f:
    f.extract(content.txt, dir_name)
print(os.listdir(dir_name))
tarfile_extract.py

运行效果

[root@ mnt]# python3 tarfile_extract.py 
[content.txt]

[root@ mnt]# ll outdir/
-rw-r--r-- 1 root root 336 Dec 25 14:16 content.txt

7、tar解压示例(推荐)

技术图片
#!/usr/bin/env python3
# encoding: utf-8

import os
import tarfile

dir_name = outdir
os.mkdir(dir_name)
with tarfile.open(tarDir.tar, r) as f:
    f.extractall(dir_name)
print(os.listdir(dir_name))
tarfile_extractall.py

运行效果

[root@ mnt]# python3 tarfile_extractall.py 
[content.txt, example.bz2]

[root@ mnt]# ll outdir/
total 8
-rw-r--r-- 1 root root 336 Dec 25 14:16 content.txt
-rw-r--r-- 1 root root  65 Jan  6 00:06 example.bz2

 8、tar解压指定的文件(推荐)

技术图片
#!/usr/bin/env python3
# encoding: utf-8

import os
import tarfile

dir_name = outdir
os.mkdir(dir_name)
with tarfile.open(tarDir.tar, r) as f:
    f.extractall(dir_name, members=[f.getmember(content.txt)])
print(os.listdir(dir_name))
arfile_extractall_member.py

运行效果

[root@ mnt]# python3 tarfile_extractall_member.py 
[content.txt]

[root@ mnt]# ll outdir/
total 4
-rw-r--r-- 1 root root 336 Dec 25 14:16 content.txt

 9、tar压缩(归档)示例

技术图片
#!/usr/bin/env python3
# encoding: utf-8

import tarfile

with tarfile.open(tarfile_add.tar, w) as out:
    out.add(content.txt)

with tarfile.open(tarfile_add.tar, r) as rf:
    for member_info in rf.getmembers():
        print(member_info.name)
tarfile_add.py

运行效果

[root@mnt]# python3 tarfile_add.py 
content.txt

[root@ mnt]# ll
-rw-r--r-- 1 root root   259 Jan  9 11:46 tarfile_add.py
-rw-r--r-- 1 root root 10240 Jan  9 11:46 tarfile_add.tar

 10、tar归档的时,修改文件名的示例

技术图片
#!/usr/bin/env python3
# encoding: utf-8

import tarfile

with tarfile.open(tarfile_addfile.tar, w) as out:
    info = out.gettarinfo(content_update.txt, arcname=content.txt)
    out.addfile(info)

with tarfile.open(tarfile_add.tar, r) as rf:
    for member_info in rf.getmembers():
        print(member_info.name)
tarfile_addfile.py

运行效果

[root@ mnt]# python3 tarfile_add.py 
content.txt

[root@ mnt]# tar -tf tarfile_add.tar 
content.txt

 11、tar从内存中取数据归档

技术图片
#!/usr/bin/env python3
# encoding: utf-8

import io
import tarfile

text = This is the data to write to the archive.
data = text.encode(utf-8)

with tarfile.open(addfile_string.tar, w) as out:
    info = tarfile.TarInfo(make_up_file.txt)  # 创建一个文件的标签信息
    info.size = len(data)  # 设置空上标签的长度
    out.addfile(info, io.BytesIO(data))  # 如果fileobj有附值,则表示是一个二进制文件,会读取fileobj.size大小,取数据归档

with tarfile.open(addfile_string.tar, r) as rf:
    for member_info in rf.getmembers():
        f = rf.extractfile(member_info.name)
        print(f.read().decode(utf-8))
tarfile_add_string.py

运行效果

[root@ mnt]# python3 tarfile_add_string.py 
This is the data to write to the archive.

[root@ mnt]# ll
-rw-r--r-- 1 root root 10240 Jan  9 12:59 addfile_string.tar

 12、往tar追加文件归档

技术图片
#!/usr/bin/env python3
# encoding: utf-8

import tarfile

# 创建tar归档文件
with tarfile.open(tarfile_append.tar, w) as out:
    out.add(test.py)

# 查看tar里面的文件名字
with tarfile.open(tarfile_append.tar, r) as rf:
    print([m.name for m in rf.getmembers()])

#往tar增加多一个文件归属
with tarfile.open(tarfile_append.tar,a) as add_f:
    add_f.add(__init__.py)

# 查看tar里面的文件名字
with tarfile.open(tarfile_append.tar, r) as rf:
    print([m.name for m in rf.getmembers()])
tarfile_append.py

运行效果

[root@ mnt]# python3 tarfile_append.py 
[content.txt]
[content.txt, content_update.txt]

[root@ mnt]# tar -tf tarfile_append.tar 
content.txt
content_update.txt

 13、tar归档并且压缩

技术图片
#!/usr/bin/env python3
# encoding: utf-8

import tarfile
import os

fmt = {:<30} {:<10}
print(fmt.format(filename, size))
print(fmt.format(content.txt, os.stat(content.txt).st_size))

files = [
    (tarfile_compression.tar, w),
    (tarfile_compression.tar.gz, w:gz),
    (tarfile_compression.tar.bz2, w:bz2),
]

for filename, write_mode in files:
    #设置归档的格式
    with tarfile.open(filename, mode=write_mode) as out:
        out.add(content.txt)

    print(fmt.format(filename, os.stat(filename).st_size), end= )
    print([m.name for m in tarfile.open(filename, r:*).getmembers()])
tarfile_compression.py

运行效果

[root@ mnt]# python3 tarfile_compression.py 
filename                       size      
content.txt                    336       
tarfile_compression.tar        10240      [content.txt]
tarfile_compression.tar.gz     361        [content.txt]  #大小被压缩
tarfile_compression.tar.bz2    341        [content.txt]

 

Python之tarfile模块的使用

标签:dir   修改时间   nim   usr   增加   修改文件名   form   hid   解压   

原文地址:https://www.cnblogs.com/ygbh/p/12169887.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!