複数の圧縮ファイルを解凍（Python）

#概要
Redreamというエミュレーターでゲームを実行するため、ディレクトリ毎に圧縮ファイルを解凍する必要がありましたので、バッチを作ってみました。

#事前作業
7zファイルを解凍するため、パッケージをインストールする。
次のコマンドで7zをインストールします。

```bash
sudo apt-get install -y p7zip-full
```


#Pythonコード
以下のPythonコードを作成してbatch.pyファイルに保存します。

```bash
#!/usr/bin/python
# -*- coding: utf-8 -*-
import io
import os
import glob

arr = glob.glob("*7z")
#print(arr)
path_w = '7z.sh'
with open(path_w, mode='w') as f:
    for str in arr:
        dir = str.replace("[GDI] ","").replace("[CDI] ","").replace(".7z","").replace("'","")
        tmpstr = str.replace("'","").replace(",","")
        os.rename("./" + str , "./" + tmpstr)
        try:
            if not os.path.exists(dir):
                cmds = "7z x '" + tmpstr + "' -o'" + dir + "'\n"
                dels = "rm -rf '" + tmpstr + "'\n"
                #print(cmds)
                #print(dels)
                f.write(cmds)
                f.write(dels)
        except OSError:
            print("Error: " + dir)
                                 
```

#Pythonコードの説明
ソース上にコメントを書いてなかったので、こちらに説明したいと思います。

```bash
#!/usr/bin/python
# -*- coding: utf-8 -*-
# 提供されるメソッドを使用するため、パッケージを宣言する部分です。
import io
import os
import glob

# 現在のディレクトリに拡張子が「7z」であるファイルのみ配列に保存します。
arr = glob.glob("*7z")

# 以下のPrintは保存されている配列の中身を確認するためのコードです。
# print(arr)

# シェルスクリプトファイルに 圧縮ファイルを解凍及び削除する
# コマンドを保存するシェルスクリプトファイル名を指定します。
path_w = '7z.sh'

# シェルスクリプトファイルを書き込みモードにオープン
with open(path_w, mode='w') as f:

    # 「7z」ファイル毎に解凍・削除コマンドを作成します。
    for str in arr:

        # 解凍するディレクトリ名を圧縮ファイル名から作成します。
        # ディレクトリ名に不要な文字列を削除します。
        dir = str.replace("[GDI] ","").replace("[CDI] ","").replace(".7z","").replace("'","")

        # ファイル名及びディレクトリ名に次の文字列があると回答が失敗するので、
        # 文字を削除します。そしてファイル名も置換します。
        tmpstr = str.replace("'","").replace(",","")
        os.rename("./" + str , "./" + tmpstr)
        try:

            # ディレクトリ名が存在しない場合、以下の処理を実行します。
            if not os.path.exists(dir):

                # 圧縮ファイルを解凍するコマンドです。
                cmds = "7z x '" + tmpstr + "' -o'" + dir + "'\n"

                # 解凍が終わったファイルを削除するコマンドです。
                dels = "rm -rf '" + tmpstr + "'\n"

                # コマンドを確認するためのコードです。
                #print(cmds)
                #print(dels)

                # コマンドをシェルスクリプトファイルに保存します。
                f.write(cmds)
                f.write(dels)

        except OSError:
            # ディレクトリ関連エラーが発生した場合、出力します。
            print("Error: " + dir)
```

#Pythonコードを実行
次のコマンドでPythonコードを実行します。
実行すると「7z.sh」ファイルが生成されます。

```bash
pi@raspberrypi:~/Downloads/redream/rom $ python batch.py
```

#7z.shファイルの中身を確認
次のコマンドでファイルの中身を確認します。
各圧縮ファイル名毎に解凍・削除コマンドが生成されていることが確認できます。

```bash
pi@raspberrypi:~/Downloads/redream/rom $ cat 7z.sh
7z x '[GDI] XXXXXXXX.7z' -o'XXXXXXXX'
rm -rf '[GDI] XXXXXXXX.7z'
7z x '[CDI] XXXXXXXX.7z' -o'XXXXXXXX'
rm -rf '[CDI] XXXXXXXX.7z'
```

#7z.shコマンドを実行
次のコマンドでシェルスクリプトファイルを実行します。
実行すると圧縮ファイルを解凍する画面が表示されます。
実行が終わったら圧縮ファイルはすべて削除されていることが確認できます。
もしファイル名に想定してない文字列によるエラーで止まっている可能性もありますが、
その場合、ファイル名・ディレクトリ名の処理に置換を追加します。
そうすると問題なく解決できるはずです。

```bash
pi@raspberrypi:~/Downloads/redream/rom $ sh 7z.sh
```

#その他
SDカードの容量が足りない場合、ファイルの解凍が失敗するケースもありますので、
注意してください。（笑）

#終わりに
これでRetropie　OSにゲームを入れるのは簡単にできましたが、
次はgame.xmlにGDI・CDI及びプレビューの画像ファイルの指定が残ってます。
Raspbianで実行する場合は、上記のgame.xmlの指定は不要です。
手動で圧縮解凍するのも面倒だったので、作ってみました。
役に立ちましたか？少し例外処理が足りないですが、必要に応じて追加してください。