基本的にはローカルで動くコードを書くほうが好きなのですが、動作環境を渡すことやGPUのVRAMが8GB以上必要なプログラムの場合にGoogle Colabを使っています。あんまり慣れていないので結構な頻度でハマります。

今回ハマったこと
コードによって生成したファイルをzip圧縮してダウンロードしたかったのですが、以下のように実行するとエラーが発生します。
処理としては/content/drive/MyDrive/witty/resultsに格納されているcsvファイルをzipファイルに固めて/content/data.zipに保存するといったものです。圧縮時にディレクトリ構造は不要だったので-jオプションをつけています。
!cd /content/drive/MyDrive/witty/results && zip -j -u /content/data.zip *.csv
どうやってもうまくいかないので調べてみると前半のcdがうまく行っていないことが原因でした。
!cdがうまくいかない理由
結構有名な話なのでご存知の方も多いと思いますが、
!は実行が一時的な実行で状態は保持されないということです。今回は&&で区切られている前半コマンドと後半コマンドでパスの変動がないという状態です。ワンライナーであれば大丈夫かなと思ったのですが、&&の前後でプロセスが別れているために発生しているのでした。
もし、実行状態を保持するのであれば%(マジックコマンド)を使用するほうが良いとなります。
!と%の違い
2つの差をまとめると…
! (エクスクラメーションマーク)
- シェル(OSのコマンド)を実行するための構文
- 例:
!cd /path/to/dir - 一時的な実行で、状態は保持されない(例:
!cdで移動しても次のセルには影響しない)
% (パーセント記号) - マジックコマンド
- IPython/Jupyterの特殊コマンド(マジックコマンド)を実行
- Pythonの実行環境に直接影響を与える
- 状態が保持される
%の効果が得られる例
%cd- ディレクトリ移動(状態が保持される)%run- Pythonスクリプトを現在の名前空間で実行%time- コードの実行時間を計測%matplotlib inline- matplotlibの出力をノートブック内に表示
簡単な比較例

今回であれば以下のように実行すれば正解かなと思います。
%cd /content/drive/MyDrive/witty/results
!zip -u /content/data.zip *.csv
※%とcdの間にスペースは不要です。
おわりに
今更、気がつくなんて恥ずかしい😫