ここではPythonを使ってファイルの圧縮と展開をやっていきます。
tarfileとzipfileを扱います。
tarfileはMacやLinuxなどを使っている人は目にすることがあると思いますが、Windowsを使っている人にはあまり目にすることはないでしょう。もう1つのzipfileはどちらのユーザーもよく使うものだと思います。
では、フォルダやファイルをひとまとめにする圧縮と展開をそれぞれやっていきましょう。
今回の操作をするために、例として作業ディレクトリに次のようなフォルダとテキストファイルの構造を用意しました。ディレクトリの中にさらにディレクトリやファイルが入っているのを確認してください。
これを使って作業をしていきます。DS_Storeが表示されていますが、これは本来は隠しファイルなので作業上の説明としては無視してください。
tarfileを使った圧縮と展開
それでは圧縮と展開をやっていきましょう。
ここでは、tarfileをインポートして作業して行きます。
import tarfile
with tarfile.open('test.tar.gz', 'w:gz') as tf:
tf.add('dir1')
with文を使って圧縮ファイルと作っていきます。ファイル名を’test.tar.gz’に指定して、モード’w’でファイルを作成しますが、圧縮する為に’w:gz’とします。これをtfとしてadd()で一番上にあるフォルダのdir1をファイルに入れて圧縮します。
実行すると、同じ作業ディレクトリ内に、test.tar.gzというファイルが作成されるはずです。これで、dir1内にあるファイルやディレクトリを圧縮することができました。
今度はこれは展開していきましょう。
import tarfile
with tarfile.open('test.tar.gz', 'r:gz') as tf:
tf.extractall(path='test_dir')
展開するには、読み込みなのでモードを’r:gz’にします。これをextractall()を使ってpathをtest_dirとして展開します。
実行すると、作業ディレクトリにtest_dirというフォルダができて、その中身を確認すると、dir1以下の各ファイルとフォルダが入っているのが確認できます。
今、圧縮したファイルを全てを展開しましたが、展開しなくても中身を確認することができます。
dir1内にあるdir1.txtファイルを確認するコードを書いてみます。
import tarfile
with tarfile.open('test.tar.gz', 'r:gz') as tf:
with tf.extractfile('dir1/dir1.txt') as f:
print(f.read())
ファイルを開くまでは同じで、さらにwith文を使ってextractfile()に対象のファイルの位置を指定して、それをread()で読んで出力します。
実行するとこうなります。(ファイル名tar.pyでAtomで実行しています)
ターミナルにファイルに書かれた内容が表示されています。
Macのターミナルでtarファイルを圧縮・展開するコマンド
上記のディレクトリ、ファイルを同じようにMacのターミナルからUNIXコマンドを使って圧縮・展開するには次のコマンドで行います。
- 圧縮コマンド
# 圧縮
$ tar -zcvf test.tar.gz dir1
- 展開コマンド
# 展開
$ tar -zxvf test.tar.gz
zipfileを使った圧縮と展開
今度はzipfileを使って圧縮と展開をやっていきましょう。
import zipfile
with zipfile.ZipFile('test.zip', 'w') as z:
z.write('dir1')
zipfileをインポートします。with文でZIpfile()に’test.zip’のファイル名を指定して圧縮します。モードは書き込みなので’w’です。これをzとして、write()でdir1を書き込むことで圧縮ファイルtest.zipが出来上がります
ただし、これはdir1のフォルダのみが圧縮されるだけで他の中身はありません。write()で書き込む時に、z.write(‘dir1/dir.txt’)などと全て指定しかないと中身も一緒に圧縮されません。
そこで、フォルダ内全てのファイルを圧縮する方法をみていきましょう。
import glob
import zipfile
with zipfile.ZipFile('test.zip', 'w') as z:
for f in glob.glob('dir1/**', recursive=True):
# print(f)
z.write(f)
ここではさらに、globというものをインポートします。Zipfile()で開くまでは同じです。
これをfor文を使って取り出すのですが、glob()を使ってフォルダを指定します。この時アスタリスク(*)を2つ指定しています。これが1つだと同じフォルダ内しか見ませんが、2つにすることで配下のディレクトリ、ファイルを見ることになります。recursiveをTrueにすることで、再帰的にディレクトリ内を全て見てくれることになります。これで取り出したものをwrite()で圧縮ファイルに書き込んでいます。(ここではpirnt()で抜き出したファイルを出力しています)
実行します。(zipdir.pyとしてAtomで実行しています)
dir1内の全てのファイルを取り出しています。同じディレクトリ内にtest.zipが作成されていることを確認しましょう。
今度はこの圧縮ファイルを展開してみます。
import zipfile
with zipfile.ZipFile('test.zip', 'r') as z:
z.extractall('test_zip')
Zipfile()で圧縮ファイルを指定し、読み込みなのでモードを’r’とします。これをextractall()で展開先フォルダをtest_zipとして展開しています。
実行すると、作業ディレクトリにtest_zipというフォルダができて、その中身を確認すると、dir1以下の各ファイルとフォルダが入っているのが確認できます。
コードを実行しなくても圧縮ファイルをダブルクリックすればファイルは展開できます。
こちらもファイルを全て展開しなくても中身を確認することができます。
tarfileでやった時と同じように、dir1内にあるdir1.txtファイルを確認するコードを書いてみます。
import zipfile
with zipfile.ZipFile('test.zip', 'r') as z:
with z.open('dir1/dir1.txt') as f:
print(f.read())
ファイルを開くまでは同じで、さらにwith文を使ってopen()に対象のファイルの位置を指定して、それをread()で読んで出力します。
実行するとこうなります。
dir1.txtの中身が表示されています。
Macのターミナルでzipファイルを圧縮・展開するコマンド
同じようにMacのターミナルからUNIXコマンドを使って圧縮・展開するには次のコマンドで行います。
- 圧縮コマンド
# 圧縮
$ zip test.zip dir1
- 展開コマンド
# 展開
$ unzip test.zip
Macのターミナル操作の基本的なUNIXコマンドはこちらです。
まとめ
ここでは、Pythonを使ってファイルやフォルダの圧縮と展開をやってみました。
tarfileとzipfileの使い方はどちらも似ていますが、違いもありますのでしっかり区別して起きましょう。
tarfileはMacやLinuxを使っている人は見慣れているでしょうが、Windowsユーザーはあまり使わないと思います。
解凍ソフトなどがインストールされていれば、ダブルクリックなどで圧縮ファイルを展開できます。