python 2.4.2を使用して完全に.tarファイルを抽出しようとしています。これが原因で、tarfileモジュールのすべての側面が使用できるわけではありません。pythonドキュメンタリーであり、構文エラーを繰り返し続けているため、役に立ちませんでした。以下は、私が試したコマンドです(成功しない):
tarfile.Tarfile.getnames(tarfile.tar)
tarfile.Tarfile.extract(tarfile.tar)
タールを完全に抽出する簡単な方法はありますか?もしそうなら、使用されているフォーマットは何ですか?また、tarfile.TarFile.extractall()は、私のpythonバージョンでは使用できません。
この例は、 tarfile
docsからのものです。
_import tarfile
tar = tarfile.open("sample.tar.gz")
tar.extractall()
tar.close()
_
最初に、tarfile.open()
を使用してTarFileオブジェクトが作成され、次にすべてのファイルがextractall()
を使用して抽出され、最後にオブジェクトが閉じられます。
別のディレクトリに抽出する場合は、 extractall
のpath
パラメータを使用します :
_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)
_
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)