特殊コピーの演習は、Python ユーティリティのセクションにあるファイル システムと外部コマンドの説明で行います。この演習は「コピースペシャル」です。google-python-exercises にあります(まだ google-python-exercises.zip をダウンロードします。詳細については、設定をご覧ください)。コードを copyspecial.py に追加します。
copyspecial.py プログラムは、1 つ以上のディレクトリを引数として受け取ります。「特別な」ものはfile は、名前のどこかにパターン __w__ を含むもので、w は 1 つ以上の単語の文字です。提供されている main() には、コマンドライン引数を解析するコードが含まれていますが、残りは任意です。以下の機能を実装する関数を記述し、関数を呼び出すように main() を変更します。
ソリューションに推奨される関数(詳細は下記を参照):
- get_special_paths(dir) -- 指定されたディレクトリにある特殊ファイルの絶対パスのリストを返します。
- copy_to(paths, dir) にパスのリストを指定して、それらのファイルを指定のディレクトリにコピーします。
- zip_to(paths, zippath) にパスのリストを指定して、それらのファイルを指定された zipfile に圧縮する
パート A(ファイルパスの操作)
すべてのディレクトリにある特殊なファイルの絶対パスのリストを収集します。最も単純なケースでは、そのリストを出力します(ここでは、コマンドの後の「.」は、現在のディレクトリを示す単一の引数です)。絶対パスを 1 行に 1 つずつ出力します。
$ ./copyspecial.py . /Users/nparlante/pycourse/day2/xyz__hello__.txt /Users/nparlante/pycourse/day2/zz__something__.jpg
ディレクトリ間で同じ名前が重複していないと仮定します(省略可:その仮定を確認し、違反している場合はエラーを確認してください)。
パート B(ファイルのコピー)
「--todir」ディレクトリがオプションがコマンドラインの先頭にある場合は、何も出力せず、代わりにファイルを指定のディレクトリにコピーして、必要に応じてディレクトリを作成します。Python モジュール「shutil」を使用する使用できます。
$ ./copyspecial.py --todir /tmp/fooby . $ ls /tmp/fooby xyz__hello__.txt zz__something__.jpg
パート C(外部プログラムの呼び出し)
"--tozip zipfile" ファイルがオプションがある場合は、コマンド「zip -j zipfile <すべてのファイルを一覧表示する>」を実行します。これにより、ファイルを含む zip ファイルを作成します。安心感を与えるために、(講義で説明したように)最初に実行するコマンドラインも出力してください。(Windows への注: Windows には、デフォルトでは標準の .zip アーカイブを作成するプログラムはありませんが、無料のオープン zip プログラムを www.info-zip.org からダウンロードできます)。
Linux ユーザーの場合、zip
がインストールされていない場合は、
sudo apt install zip
を呼び出してインストールできます。
$ ./copyspecial.py --tozip tmp.zip .Command I'm going to do:zip -j tmp.zip /Users/nparlante/pycourse/day2/xyz__hello__.txt /Users/nparlante/pycourse/day2/zz__something__.jpg
子プロセスがエラーコードで終了した場合は、エラーコードで終了し、コマンドの出力を出力します。これをテストするには、存在しないディレクトリに zip ファイルを書き込んでみてください。
$ ./copyspecial.py --tozip /no/way.zip .Command I'm going to do:zip -j /no/way.zip /Users/nparlante/pycourse/day2/xyz__hello__.txt /Users/nparlante/pycourse/day2/zz__something__.jpg
zip I/O error: No such file or directory zip error: Could not create output file (/no/way.zip)