機械学習やPythonの習得にとても便利なColaboratoryですが、実はファイル編集だけはちょっと面倒です。
そこで、今回はColaboratoryでファイル編集をする場合に便利な方法を2つピックアップしました。
- 【方法1】 Google Drive + Anyfile Notepad (← おすすめ)
- 【方法2】 bashコマンド(cat, sed) (← サクッとファイル編集したいときに便利)
【方法1】 Google Drive + Anyfile Notepad
Google Drive連携自体は、よく使われる方法ですね。これに加えて、Anyfile NotepadというGoogle Driveアプリを使うことで、どんなファイルでも簡単に編集できるようになります。
(ちなみに、Anyfile Notepadを使わなくても、Googleドライブファイルストリーム等を使ってPCから直接編集することもできます。PC上のアプリでファイル編集したい場合はそちらがおすすめです。)
Google Driveの認証とマウント
Google Driveをマウントするには以下のコマンドを使います。
from google.colab import drive
drive.mount('/content/drive')
あとは以下のようなURLが表示されるので、URLを開き、最後に出てくる暗号のような文字列を入力欄にコピペすれば完了です。
Anyfile Notepadのインストール
Anyfile Notepadのインストールは、ブラウザ版Google Driveの右クリックメニューから、アプリの追加を選択し、Anyfile Notepadを検索すればすぐインストールできます。
あとは、編集したいファイルを右クリックして、「アプリで開く > Anyfile Notepad」を選択すればOKです。簡単ですね。
実際にファイルを開いてみた様子です。ここではLICENSE.txt
を開いてみていますが、どんな拡張子のファイルでも編集できます。
ここで1点だけ注意ですが、Google Driveでの編集が実際に反映されるのに、時間差があるときがあります。
なお、この方法を応用すれば、画像ファイルやExcelファイルも追加アプリで直接編集できるので、いろいろと応用の効く方法ですね。
ちなみにGoogle Drive連携を使う方法には他にもいろいろメリットがあって、Colaboratory上のマシンが停止してもファイルはDriveに残るので、学習後に継続してファイルを使う場合等にとっても便利です。セッションが切れてもすぐ継続して学習を進められるのは嬉しいですね。
【方法2】 bashコマンド (cat, sed)
Google Driveを使う方法でだいたいは事足りるのですが、ちょっとした編集のとき、毎回Google Drive上で編集するのは面倒です。(Googleドライブファイルストリームを使えば多少は楽ですが。)
そんなとき、Colaboratory上だけでサクッとファイル編集したいときは、以下の方法がおすすめです。
ファイルの新規作成と、中身の確認 (catコマンド)
%%bash
や!
で始まるセルは、bashコマンド(Linux上のコマンド)になることを活用して、cat
コマンドを使ってファイルを新規作成します。
%%bash
cat <<EOF > test.txt
hello
this
is
test
file
EOF
EOFからEOFの間は自由に記述できます。ファイルの中身を確認したい場合も、同じくcatコマンドを使います。
!cat test.txt # ちなみにcatは、catenate(連結)の意味
大抵のテキストファイルの新規作成はこれで事足りますし、ファイル全体を書き換えるときは同じ方法が使えます。
(ちなみに蛇足ですが !sudo apt install imagemagick
でImageMagickをインストールすれば、ちょっとした画像ファイルの作成や編集なんかもできます。もちろんffmpeg
とかも同様に使えますし、さらにはgcc
やruby
、localtunnel
なんかもインストールできます。Colaboratoryは拡張性がすごいですね。)
ファイルの書き換え (sedコマンド)
Colaboratory上では、EmacsやVim等の対話型エディタを開くことはできないので、sed
コマンドを使います。
まず行番号の確認
まず編集する前に、先ほど作成した test.txt
を、行番号付きで中身を確認します。
!cat -n test.txt # -n はnumberの意味
もし表示される行数が多すぎる場合は、head
コマンドやtail
コマンドを使って表示行数を制限できます。(行の範囲を指定することもできますが、ここでは割愛します。)
%%bash
cat -n test.txt | head -n 2 # 最初の2行を表示
echo; echo # 空行を2つ表示
cat -n test.txt | tail -n 1 # 最後の1行を表示
行の書き換え
では早速、sed
コマンドを使って、2行目をworld
に書き換えます。
%%bash
sed -i -e "2c world" test.txt # ここで、2c は2行目を書き換える (change) の意味
cat -n test.txt # 結果の確認
書き換わりました。行番号の確認さえできれば、簡単ですね。
(ちなみにsed
はstream editorの略です。-i -e
オプションはそれぞれ、--in-place --expression
の略で、ファイルの置き換えと実行コマンドを示すオプションの意味です。)
行の挿入
ちなみに挿入したいときは、c
(change) の代わりに i
(insert) や a
(append) を使います。
%%bash
sed -i -e "2i great" test.txt # 2行目にgreatを挿入する
cat -n test.txt # 結果の確認
%%bash
sed -i -e "2a and wonderful" test.txt # 2行目の次に、and wonderfulを挿入する
cat -n test.txt # 結果の確認
行の削除
削除するときは、d
(delete) を使います。
%%bash
sed -i -e "5,7d" test.txt # 5〜7行目を削除する
cat -n test.txt # 結果の確認
文字列の置き換え
文字列を置き換えるときは、s
(substitute) を使います。
%%bash
sed -i -e "1s/hello/good morning/" test.txt # 1行目のhelloをgood morningに置き換える
cat -n test.txt # 結果の確認
ちなみにファイル全体の中で置き換えることもできます。
%%bash
sed -i -e "s/d/D/g" test.txt # dをDに置き換える
cat -n test.txt # 結果の確認
便利ですね。
なんだか後半は単なるsed
コマンド講座になってしまいましたが、sed
コマンドはこういう対話シェルが使えない環境では本領発揮しますね。これを応用すれば、awk
コマンドなんかも組み合わせて、テキストファイルをまとめて編集するときなんかに活躍しそうです。