在python脚本中读取tar文件内容而不对其进行解压缩


80

我有一个tar文件,其中包含许多文件。我需要编写一个python脚本,该脚本将读取文件的内容并提供总数字符的计数,包括字母,空格,换行符的总数,所有内容,而无需解压缩tar文件。


您如何计算字符/字母/空格/所有内容而不将其提取到其他位置?

15
正是这个问题。
Erik Kaplun

Answers:


125

您可以使用 getmembers()

>>> import  tarfile
>>> tar = tarfile.open("test.tar")
>>> tar.getmembers()

之后,您可以extractfile()用来将成员提取为文件对象。只是一个例子

import tarfile,os
import sys
os.chdir("/tmp/foo")
tar = tarfile.open("test.tar")
for member in tar.getmembers():
    f=tar.extractfile(member)
    content=f.read()
    print "%s has %d newlines" %(member, content.count("\n"))
    print "%s has %d spaces" % (member,content.count(" "))
    print "%s has %d characters" % (member, len(content))
    sys.exit()
tar.close()

对于f上面示例中的文件对象,可以使用read()readlines()等等。


16
可以将“用于tar.getmembers()中的成员”更改为“用于tar中的成员”,它可以是生成器,也可以是迭代器(我不确定是哪个)。但它一次只能成为一个成员。
huggie 2011年

2
我只是遇到了类似的问题,但是即使我使用了该'r|'选项,tarfile模块似乎也占用了我的内存。
devsnd 2012年

2
啊。我解决了 假设您将按照huggie的提示编写代码,则必须不时地“清理”成员列表。因此,以上述代码示例为例tar.members = []。此处的更多信息:bit.ly/JKXrg6
devsnd 2012年

tar.getmembers()放入for member in tar.getmembers()循环时会被多次调用?
张海峰

1
完成“ f = tar.extractfile(member)”之后,是否还需要关闭f?
博莱

12

您需要使用tarfile模块。具体来说,您使用类TarFile的实例访问文件,然后使用TarFile.getnames()访问名称。

 |  getnames(self)
 |      Return the members of the archive as a list of their names. It has
 |      the same order as the list returned by getmembers().

相反,如果您想阅读内容,则使用此方法

 |  extractfile(self, member)
 |      Extract a member from the archive as a file object. `member' may be
 |      a filename or a TarInfo object. If `member' is a regular file, a
 |      file-like object is returned. If `member' is a link, a file-like
 |      object is constructed from the link's target. If `member' is none of
 |      the above, None is returned.
 |      The file-like object is read-only and provides the following
 |      methods: read(), readline(), readlines(), seek() and tell()

请注意,您可以通过这样构造的索引访问成员myFile = myArchive.extractfile( dict(zip(myArchive.getnames(), myArchive.getmembers()))['path/to/file'] ).read()
ThorSummoner 2014年


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.