web-dev-qa-db-ja.com

(Python)経由でunzip(.tar.gz)ファイルのスクリプトを作成したい

1つのディレクトリ内のフォルダーからすべての.tar.gzファイルを解凍するためのスクリプトを作成しようとしています。たとえば、呼び出すファイル(testing.tar.gz)があります。次に、手動で行う場合、「ここに抽出」を押すと、.tar.gzファイルが新しいファイルを作成し、testing.tarを呼び出します。最後に、「ここに抽出」を押すプロセスを繰り返すと、.tarファイルがすべての.pdfファイルを生成します。

私はそれをどのように行うことができるのだろうか、そして私はここに私のコードを持っています、それは本当にカントーに動作しないようです。

import os
import tarfile
import zipfile

def extract_file(path, to_directory='.'):
    if path.endswith('.Zip'):
        opener, mode = zipfile.ZipFile, 'r'
    Elif path.endswith('.tar.gz') or path.endswith('.tgz'):
        opener, mode = tarfile.open, 'r:gz'
    Elif path.endswith('.tar.bz2') or path.endswith('.tbz'):
        opener, mode = tarfile.open, 'r:bz2'
    else: 
        raise ValueError, "Could not extract `%s` as no appropriate extractor is found" % path

    cwd = os.getcwd()
    os.chdir(to_directory)

    try:
        file = opener(path, mode)
        try: file.extractall()
        finally: file.close()
    finally:
        os.chdir(cwd)
34
Alex

.tar.gzを1回簡単に実行できるのに、なぜ2回「プレス」して.tar.gzを抽出したいのですか? .tarと.tar.gzの両方を一度に抽出する簡単なコードを次に示します。

import tarfile
if (fname.endswith("tar.gz")):
    tar = tarfile.open(fname, "r:gz")
    tar.extractall()
    tar.close()
Elif (fname.endswith("tar")):
    tar = tarfile.open(fname, "r:")
    tar.extractall()
    tar.close()
63
Lye Heng Foo

python 3を使用している場合、ほとんどの一般的なアーカイブ形式で機能する shutil.unpack_archive を使用する必要があります。

shutil.unpack_archive(filename [、extract_dir [、format]])

アーカイブを解凍します。 filenameはアーカイブのフルパスです。 extract_dirは、アーカイブが展開されるターゲットディレクトリの名前です。指定しない場合、現在の作業ディレクトリが使用されます。

例えば:

def extract_all(archives, extract_path):
    for filename in archives:
        shutil.unpack_archive(filename, extract_path)
4
mickours

あなたのプログラムを実行したとき、tar.gzと.tgzファイルに対して完璧に機能しました。Zipを開いたときに正しいアイテムを提供しませんでしたが、エラーを発生させたのは.tbzだけでした。エラーは、間違ったファイルタイプがあったと言っていたので、間違った方法で.tbzを解凍したと思いますが、そうしませんでした。 .Zipの問題を解決する方法の1つは、os.command()を使用して、コマンドライン(OSに応じて)を解凍することです。パスを正しく入力しても、_MACOSXフォルダーが返されます。私が遭遇した他の唯一のエラーは、エラーを発生させるために不適切な構文を使用したことです。
これは、使用すべきだったものです。

raise ValueError("Error message here")

コンマを使用し、括弧を使用していません。お役に立てれば!

0
Beckett O'Brien

より簡単なオプションを次に示します。

import envoy # pip install envoy

def tar_xzf(f):
   r = envoy.run("tar xzf %s -C %s" % (f, "directory"))
0
Ehsan

コンテキストマネージャーの使用:

import tarfile
<another code>
with tarfile.open(os.path.join(os.environ['BACKUP_DIR'],
                  f'Backup_{self.batch_id}.tar.gz'), "r:gz") as so:
    so.extractall(path=os.environ['BACKUP_DIR'])
0
Taras Vaskiv