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)
.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()
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)
あなたのプログラムを実行したとき、tar.gzと.tgzファイルに対して完璧に機能しました。Zipを開いたときに正しいアイテムを提供しませんでしたが、エラーを発生させたのは.tbzだけでした。エラーは、間違ったファイルタイプがあったと言っていたので、間違った方法で.tbzを解凍したと思いますが、そうしませんでした。 .Zipの問題を解決する方法の1つは、os.command()を使用して、コマンドライン(OSに応じて)を解凍することです。パスを正しく入力しても、_MACOSXフォルダーが返されます。私が遭遇した他の唯一のエラーは、エラーを発生させるために不適切な構文を使用したことです。
これは、使用すべきだったものです。
raise ValueError("Error message here")
コンマを使用し、括弧を使用していません。お役に立てれば!
より簡単なオプションを次に示します。
import envoy # pip install envoy
def tar_xzf(f):
r = envoy.run("tar xzf %s -C %s" % (f, "directory"))
コンテキストマネージャーの使用:
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'])