!cd と %cd の違いは?
Jupyter Notebookでは!ls !cdのようなシェルコマンドや,%time %runなどのマジックコマンドが利用できます.
Notebook上でディレクトリを移動する場合,シェルコマンド!cdを使いたくなりますが,なぜかマジックコマンドにも%cdが存在しています.この違いは何でしょうか?
結論から言うと,
-
%cdを使うとPythonの作業ディレクトリを変更できる. -
!cdを使うと新しいシェル内でcdを実行し,そのシェルは終了する.
つまりPythonの作業ディレクトリを変えたいときは!cdではなく%cdを使います.
実際に試してみる
簡単に動作を確認してみます.個人的にGoogle Colabをよく使うので以下はGoogle Colab上で実行していますが,他のNotebook環境でも同じはずです.
Google Colabでは,起動時のディレクトリは/contentで,そこにはsample_dataというディレクトリが入っています.今は関係ありませんが,sample_dataディレクトリにはサンプルデータがいろいろ用意されています.

/content/sample_data内で作業するために,cdを使ってここに移動したいという状況を仮定します.
まず!cdでsample_dataに移動してみます.

!cdでsample_dataに移動しているつもりですが(3),!pwdの出力を見ると移動できていないことがわかります(4).一応Pythonで確認してみますが,やはり移動できていません.
!cdを実行すると,今Pythonを実行しているシェルとは別に新しいシェルを作り,その中でcdを実行します.新しいシェルでいくらディレクトリを移動しても,今Pythonを実行しているシェルには反映されません.これがディレクトリを移動できない原因です.
参考:
次に%cdでsample_dataに移動してみます.

こちらは問題なくディレクトリを移動できています.
さいごに
とりあえずNotebookでcdを使いたいときは%cdを使っておけば良さそうです.
というかPython Data Science Handbookにはっきりそう書いてありますね…
一度読んだことがあるはずなのに完全に忘れていました.
