「Copy Special」の演習は、Python ユーティリティ セクションにあるファイル システムおよび外部コマンドのマテリアルとともに行われます。この演習は google-python-exercises 内の「copyspecial」ディレクトリにあります(google-python-exercises.zip をまだダウンロードしていない場合はダウンロードしてください。詳しくは、セットアップをご覧ください)。コードを copyspecial.py に追加します。
copyspecial.py プログラムは、1 つ以上のディレクトリを引数として受け取ります。「特別な」ファイルとは、名前に __w__ というパターンが含まれていて、w が 1 つ以上の文字からなるファイルのことです。提供されている main() にはコマンドライン引数を解析するコードが含まれていますが、あとはユーザーが決めます。以下の機能を実装する関数を記述し、関数を呼び出すように main() を変更します。
ソリューションで推奨される関数(詳細は以下を参照):
- get_special_paths(dir) -- 指定したディレクトリ内にある特殊ファイルの絶対パスのリストを返す
- copy_to(paths, dir) にパスのリストを指定すると、それらのファイルが指定されたディレクトリにコピーされます。
- zip_to(paths, zippath) のリストを使用して、指定された zipfile にそれらのファイルを zip ファイルとして格納します。
パート A(ファイルパスの操作)
すべてのディレクトリにある特別なファイルの絶対パスのリストを収集します。最も単純なケースでは、リストを出力します(コマンドの後の「.」は、現在のディレクトリを示す単一の引数です)。1 行に 1 つずつ絶対パスを出力します。
$ ./copyspecial.py . /Users/nparlante/pycourse/day2/xyz__hello__.txt /Users/nparlante/pycourse/day2/zz__something__.jpg
ディレクトリ全体で同じ名前が使用されていないと仮定します(省略可: その前提条件を確認し、違反している場合はエラーを出します)。
パート B(ファイルのコピー)
コマンドラインの先頭に「--todir dir」オプションがある場合は、何も出力せずに、必要なディレクトリにファイルをコピーして、必要なディレクトリにコピーします。ファイルのコピーには 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 アーカイブを生成するプログラムはデフォルトでは提供されていませんが、www.info-zip.org から無料でオープンな zip プログラムをダウンロードしていただけます)。
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)