Python之tarfile模塊的使用


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
 類型: b'0'
 大小: 336 bytes
example.bz2
 修改時間: Mon Jan  6 00:06:31 2020
 模式: 420
 類型: b'0'
 大小: 65 bytes
tarDir
 修改時間: Thu Jan  9 10:29:51 2020
 模式: 493
 類型: b'5'
 大小: 0 bytes
tarDir/lines.bz2
 修改時間: Sun Jan  5 23:43:05 2020
 模式: 420
 類型: b'0'
 大小: 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 讀到的內容:b'Lorem 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']


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM