Pythonスクリプトでtarファイルの内容を解凍せずに読み取る


82

多数のファイルを含むtarファイルがあります。tarファイルを解凍せずに、ファイルの内容を読み取り、文字、スペース、改行文字の総数を含む合計文字数を示すPythonスクリプトを作成する必要があります。


文字/文字/スペース/すべてを他の場所に抽出せずに数えるにはどうすればよいですか?
YOU

16
それはまさに尋ねられた質問です。
Erik Kaplun 2013年

回答:


127

あなたが使用することができます 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()などを使用できます。


17
「formemberin tar.getmembers()」は、ジェネレーターまたはイテレーターのいずれかである「for member intar」に変更できます(どちらかはわかりません)。ただし、一度に1つずつメンバーを取得します。
huggie 2011

2
同様の問題が発生しましたが、'r|'オプションを使用したにもかかわらず、tarfileモジュールがRAMを消費しているようです。
devsnd 2012年

2
ああ。私はそれを解決しました。huggieが示唆するようにコードを書くと仮定すると、メンバーのリストを時々「クリーン」にする必要があります。したがって、上記のコード例を考えると、それはになりますtar.members = []。詳細はこちら:bit.ly/JKXrg6
devsnd

tar.getmembers()にそれを置く複数回呼び出されるfor member in tar.getmembers()ループを?
Haifeng Zhang

1
「f = tar.extractfile(member)」を実行した後、fも閉じる必要がありますか?
bolei 2017年

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

5

@ stefano-boriniによって言及されたメソッドの実装次のようなファイル名を介してtarアーカイブメンバーにアクセスします

#python3
myFile = myArchive.extractfile( 
    dict(zip(
        myArchive.getnames(), 
        myArchive.getmembers()
    ))['path/to/file'] 
).read()`

クレジット:


0

tarfile.list()を使用できますex:

filename = "abc.tar.bz2"
with open( filename , mode='r:bz2') as f1:
    print(f1.list())

これらのデータを取得した後。この出力を操作またはファイルに書き込んで、必要に応じて実行できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.