tarfile读文件python_Python之tarfile模块的使用

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

#!/usr/bin/envpython3

# encoding: utf-8import tarfile

filename_list= ['REME.txt', 'example.bz2', 'tarDir.tar', 'content.txt']for filename infilename_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 [Errno2] No such file or directory: 'REME.txt'example.bz2 False

tarDir.tarTrue

content.txt False

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

#!/usr/bin/env python3#encoding: utf-8

importtarfile

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

importtarfileimporttime

with tarfile.open('tarDir.tar', 'r') as t:for member_info int.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 Dec25 14:16:23 2019模式:420类型: b'0'大小:336bytes

example.bz2

修改时间: Mon Jan6 00:06:31 2020模式:420类型: b'0'大小:65bytes

tarDir

修改时间: Thu Jan9 10:29:51 2020模式:493类型: b'5'大小:0bytes

tarDir/lines.bz2

修改时间: Sun Jan5 23:43:05 2020模式:420类型: b'0'大小:88 bytes

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

#!/usr/bin/env python3#encoding: utf-8

importtarfile

with tarfile.open('tarDir.tar', 'r') as t:for filename in ['example.bz2', 'test']:try:

info=t.getmember(filename)exceptKeyError:print('{} 文件不存在'.format(filename))else:print('文件名:{} 大小:{} bytes'.format(info.name, info.size))

tarfile_getmember.py

运行效果

[root@ mnt]# python3 tarfile_getmember.py

文件名:example.bz2 大小:65bytes

test 文件不存在

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

#!/usr/bin/env python3#encoding: utf-8

importtarfile

with tarfile.open('tarDir.tar', 'r') as t:for filename in ['example.bz2', 'test']:try:

f=t.extractfile(filename)exceptKeyError: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

importosimporttarfile

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

importosimporttarfile

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/total8

-rw-r--r-- 1 root root 336 Dec 25 14:16content.txt-rw-r--r-- 1 root root 65 Jan 6 00:06 example.bz2

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

#!/usr/bin/env python3#encoding: utf-8

importosimporttarfile

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/total4

-rw-r--r-- 1 root root 336 Dec 25 14:16 content.txt

9、tar压缩(归档)示例

#!/usr/bin/env python3#encoding: utf-8

importtarfile

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 inrf.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:46tarfile_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

importtarfile

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 inrf.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

importioimporttarfile

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 inrf.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 towriteto 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

importtarfile#创建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 inrf.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.tarcontent.txt

content_update.txt

13、tar归档并且压缩

#!/usr/bin/env python3#encoding: utf-8

importtarfileimportos

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 infiles:#设置归档的格式

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.txt336tarfile_compression.tar10240 ['content.txt']

tarfile_compression.tar.gz361 ['content.txt'] #大小被压缩

tarfile_compression.tar.bz2 341 ['content.txt']

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值