Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのtarfileモジュールでtarアーカイブを読み書きする方法


tarアーカイブとは

「tar」ユーティリティは、もともとUNIXオペレーティングシステム向けに導入されたツールです。その目的は、複数のファイルを1つのアーカイブファイル(いわゆる「tarball」と呼ばれます)にまとめ、ファイルの配布を容易にすることです。Python標準ライブラリのtarfileモジュールが提供する関数を使えば、tarアーカイブの作成や、tarballからの必要なファイルの抽出を簡単に行えます。

アーカイブはgzipbzip2lzmaによる圧縮付きで作成できるほか、まったく圧縮せずに作成することも可能です。

このモジュールの中核となるのはopen()関数で、これを使ってtarファイルへの書き込みや読み取りを実現します。

open()関数

この関数は、引数として渡されたファイル名に対応するTarFileオブジェクトを返します。第2引数としてmode(モード)を指定する必要があり、デフォルトは「'r'」(圧縮なしの読み取り)です。指定できる主なモードは以下の通りです。

No.モードと動作
1'r' または 'r:*'
圧縮形式を自動判別して読み取り用に開きます。
2'r:'
圧縮なしで読み取り用に開きます。
3'r:gz'
gzip圧縮で読み取り用に開きます。
4'r:bz2'
bzip2圧縮で読み取り用に開きます。
5'r:xz'
lzma圧縮で読み取り用に開きます。
6'x' または 'x:'
圧縮なしでtarファイルを排他的に新規作成します。
7'x:gz'
gzip圧縮でtarファイルを新規作成します。
8'x:bz2'
bzip2圧縮でtarファイルを新規作成します。
9'x:xz'
lzma圧縮でtarファイルを新規作成します。
10'a' または 'a:'
圧縮なしで追記(追加)用に開きます。
11'w' または 'w:'
圧縮なしで書き込み用に開きます。
12'w:gz'
gzip圧縮で書き込み用に開きます。
13'w:bz2'
bzip2圧縮で書き込み用に開きます。
14'w:xz'
lzma圧縮で書き込み用に開きます。

TarFileクラス

このモジュールではTarFileクラスが定義されています。open()関数を使う代わりに、コンストラクタを直接呼び出してTarFileオブジェクトを生成することもできます。

このコンストラクタも、ファイル名とmodeパラメータが必要です。modeに指定できる値は上記の表と同じです。

TarFileクラスの主なメソッドは以下の通りです。

add()

アーカイブにファイルを追加するメソッドです。引数には、ファイル名のほか、ディレクトリ、シンボリックリンク、ショートカットなどの名前を指定できます。デフォルトではディレクトリが再帰的に追加されるため、再帰的な追加を避けたい場合はrecursiveパラメータをFalseに設定してください。

addfile()

TarInfoオブジェクトをアーカイブに追加するメソッドです。

extractall()

アーカイブ内のすべてのメンバーを展開するメソッドです。展開先のパスを明示的に指定しない場合は、カレントディレクトリに展開されます。

extract()

指定したメンバーだけを、指定したパスに展開するメソッドです。デフォルトの展開先はカレントディレクトリです。

基本的な使い方の例

次の例では、gzipアルゴリズムで圧縮するtarファイルを開き、その中にファイルを追加しています。

>>> fp = tarfile.open("zen.tar.gz","w:gz")
>>> fp.add("zen.txt")
>>> fp.close()

カレントワーキングディレクトリに「zen.txt」ファイルが存在していれば、そのファイルが「zen.tar.gz」に追加されます。

続いて、tarアーカイブからファイルを取り出すコードです。アーカイブ内の全ファイル(この例では1つのみ)がカレントフォルダに展開されます。結果を確認したい場合は、あらかじめカレントフォルダ内の「zen.txt」を削除するか、名前を変更しておきましょう。

>>> fp = tarfile.open("zen.tar.gz","r:gz")
>>> fp.extractall()
>>> fp.close()

実行後、カレントディレクトリに「zen.txt」ファイルが復元されていることが確認できます。

カレントディレクトリ内のすべてのファイルを含むtarアーカイブを作成するには、次のようなコードを使用します。

import tarfile, glob
>>> fp=tarfile.open('file.tar','w')
>>> for file in glob.glob('*.*'):
fp.add(file)
>>> fp.close()

コマンドラインインターフェースからの操作

tarファイルの作成と展開は、コマンドラインインターフェースからも行えます。たとえば、コマンドウィンドウで以下のコマンドを実行すると、「lines.txt」ファイルがtarファイルに追加されます。

C:\python36 >python -m tarfile -c line.tar lines.txt

利用できる主なコマンドラインオプションは以下の通りです。

-l または --listtarファイル内のファイル一覧を表示します。
-c または --createソースファイルからtarファイルを作成します。
-e または --extractoutput_dirが指定されていない場合、tarファイルをカレントディレクトリに展開します。
-t または --testtarファイルが有効かどうかを検証します。
-v または --verbose詳細な出力を表示します。

次のコマンドラインは、line.tarをカレントディレクトリ直下のnewdirフォルダに展開します。

C:\python36>python -m tarfile -e line.tar newdir/

次のコマンドラインは、tarアーカイブ内のすべてのファイルを一覧表示します。

C:\python36>python -m tarfile -l files.tar

本記事では、Pythonのtarfileモジュールについて解説し、同モジュールで定義されているクラスと関数、およびコマンドラインからの利用方法を紹介しました。

  1. PythonのopenpyxlモジュールでExcelファイルを読み書きする方法【初心者向け完全ガイド】

    Pythonには、Excelファイル(.xlsx)を操作するためのopenpyxlという便利なモジュールが用意されています。このモジュールを使えば、Excelファイルの新規作成、データの書き込み・読み取り、シートの追加や管理など、さまざまな操作をプログラムから自動的に行うことができます。 本記事では、openpyxlの基本的な使い方を、実際に動作するサンプルコードとともに順番に解説していきます。 openpyxlのインストール方法 openpyxlは標準ライブラリではないため、まずインストールが必要です。コマンドプロンプト(またはターミナル)で以下のコマンドを実行してください。 pip ins

  2. LinuxでTARコマンドを使ってファイルをアーカイブする方法

    アーカイブとは、多数のフォルダやファイルを1つのファイルの中にまとめて格納できる特殊なファイルのことです。アーカイブが便利な最大の理由は、中に含まれるファイルやフォルダが、アーカイブ外にあったときと同じファイル構造を保持しており、展開した際にもその構造がそのまま維持される点にあります。アーカイブにはさまざまな形式がありますが、そのひとつがTAR(Tape Archive)形式です。LinuxやUnix系システムで広く使われているTARファイル(通称「tarball」とも呼ばれます)は、Consolidated Unix Archive形式のファイルです。 TARファイル形式は、大量のデータを「