web-dev-qa-db-ja.com

python 2.4を使用してtarファイルを抽出するにはどうすればよいですか?

python 2.4.2を使用して完全に.tarファイルを抽出しようとしています。これが原因で、tarfileモジュールのすべての側面が使用できるわけではありません。pythonドキュメンタリーであり、構文エラーを繰り返し続けているため、役に立ちませんでした。以下は、私が試したコマンドです(成功しない):

tarfile.Tarfile.getnames(tarfile.tar)
tarfile.Tarfile.extract(tarfile.tar)

タールを完全に抽出する簡単な方法はありますか?もしそうなら、使用されているフォーマットは何ですか?また、tarfile.TarFile.extractall()は、私のpythonバージョンでは使用できません。

13
Connor Tepfer

この例は、 tarfile docsからのものです。

_import tarfile
tar = tarfile.open("sample.tar.gz")
tar.extractall()
tar.close()
_

最初に、tarfile.open()を使用してTarFileオブジェクトが作成され、次にすべてのファイルがextractall()を使用して抽出され、最後にオブジェクトが閉じられます。

別のディレクトリに抽出する場合は、 extractallpathパラメータを使用します

_tar.extractall(path='/home/connor/')
_

編集:今、あなたは古いPython TarFile.extractall()メソッド。古いバージョンのtarfileの ドキュメント はこれを確認します。代わりに次のようなことを行うことができます:

_for member in tar.getmembers():
    print "Extracting %s" % member.name
    tar.extract(member, path='/home/connor/')
_

Tarファイルにディレクトリがある場合、これはおそらく失敗します(テストしていません)。より完全なソリューションについては、 Python 2.7 extractallの実装 を参照してください

編集2:古いPythonバージョンを使用する簡単なソリューションの場合、 tarコマンドを呼び出します_subprocess.call_を使用

_import subprocess
tarfile = '/path/to/myfile.tar'
path = '/home/connor'
retcode = subprocess.call(['tar', '-xvf', tarfile, '-C', path])
if retcode == 0:
    print "Extracted successfully"
else:
    raise IOError('tar exited with code %d' % retcode)
_
31
André Laszlo

torchvision library のより一般的なコードは次のとおりです。

import os
import hashlib
import gzip
import tarfile
import zipfile

def _is_tarxz(filename):
    return filename.endswith(".tar.xz")


def _is_tar(filename):
    return filename.endswith(".tar")


def _is_targz(filename):
    return filename.endswith(".tar.gz")


def _is_tgz(filename):
    return filename.endswith(".tgz")


def _is_gzip(filename):
    return filename.endswith(".gz") and not filename.endswith(".tar.gz")


def _is_Zip(filename):
    return filename.endswith(".Zip")


def extract_archive(from_path, to_path=None, remove_finished=False):
    if to_path is None:
        to_path = os.path.dirname(from_path)

    if _is_tar(from_path):
        with tarfile.open(from_path, 'r') as tar:
            tar.extractall(path=to_path)
    Elif _is_targz(from_path) or _is_tgz(from_path):
        with tarfile.open(from_path, 'r:gz') as tar:
            tar.extractall(path=to_path)
    Elif _is_tarxz(from_path):
        with tarfile.open(from_path, 'r:xz') as tar:
            tar.extractall(path=to_path)
    Elif _is_gzip(from_path):
        to_path = os.path.join(to_path, os.path.splitext(os.path.basename(from_path))[0])
        with open(to_path, "wb") as out_f, gzip.GzipFile(from_path) as Zip_f:
            out_f.write(Zip_f.read())
    Elif _is_Zip(from_path):
        with zipfile.ZipFile(from_path, 'r') as z:
            z.extractall(to_path)
    else:
        raise ValueError("Extraction of {} not supported".format(from_path))

    if remove_finished:
        os.remove(from_path)
0
Shital Shah