GoogleColaboratory でGoogleDrive 内のファイル名を一括変更する

#なぜ、一括変更が必要になったか
ファイルを連番で整理して使い勝手をよくしたかったからです。
元々は円盤データで、アップロードしたものを名前順にソートすると再生番号順にならなかったので、番号を先頭に持ってきて解決することにしました。
始めは手動で変更していたのですが300ファイル以上あり、心が折れたのでPythonで処理することにしました。

#指針
ファイル名の形式は以下のようになっていました。

```
[文字列1]_[文字列2]_[番号].[拡張子]
[番号]␣[文字列1]_[文字列2]_[番号].[拡張子] #手動で変えたやつ
```

そのため、まだ変更していないファイルにのみ、

・番号をファイル名から抽出
・抽出した番号を先頭につけたファイル名に変更

という処理を行うことにしました。


#ColaboratoryにDriveをマウントする
ColaboratoryからDriveを操作するには、Driveをマウントする必要があります。
以下のコードを打ち込んで、出力されるURL```Go to this URL in a browser: https://accounts.google.com/(以下略)```にアクセスします。リンク先でアカウントにログインします。コードをコピーするように言われるので表示されたコードをコピーします。

```python
from google.colab import drive
drive.mount(mountpoint="drive")
```

リンク先でコピーしたコードを```Enter your authorization code:```に貼り付けます。

```Enter your authorization code:　　　　　　　```
うまくいっていれば、```Mounted at drive```と出力されます。

#実際に書いたコード
各部の解説は後に記述します。

```python
import os

def get_itemlist(path):
    if os.getcwd() != path:
        os.chdir(path)     
    return os.listdir()

def change_name(item):
    new_name = item[-7:-4] + " " + item
    os.rename(item, new_name)

def batch(path):
    item_list = get_itemlist(path)
    for item in item_list:
        if " " not in item:
            change_name(item)
        else:
            pass
    os.chdir("/../../../content")

path = "/content/drive/ディレクトリ名"
batch(path)
```

#get_itemlist関数について

```python:get_itemlist()
def get_itemlist(path):
    if os.getcwd() != path:
        os.chdir(path)     
    return os.listdir()
```

カレントディレクトリが作業したいディレクトリと異なる場合のみ、作業ディレクトリを変更するようにし、os.listdir()で作業ディレクトリ内のアイテムリストを返すようになっています。
os.getcwd()で現在のディレクトリを取得、os.chdir(path)でディレクトリをpathに変更しています。

```:擬似コード
def get_itemlist(作業したいディレクトリのパス):
    もし　カレントディレクトリが作業したいディレクトリと異なる場合：
        ディレクトリを作業したいディレクトリに変更  
    ディレクトリ内のアイテムリストを返す
```

#change_name関数について

```python:change_name()
def change_name(item):
    new_name = item[-7:-4] + " " + item
    os.rename(item, new_name)
```
ファイル名の```[文字列1]_[文字列2]_[番号].[拡張子]```から、番号をスライスで取り出し、元のファイル名とスペースを挟んで結合することで、```[番号]␣[文字列1]_[文字列2]_[番号].[拡張子]```の形式に直しています。
os.rename(現在のファイル名, 新規ファイル名)でファイル名の変更を行なっています。

```:擬似コード
def change_name(ファイル名):
    新規ファイル名 を [番号]と␣と[元のファイル名]を結合することで作成
    現在のファイル名を新規ファイル名に変更
```

#batch関数について

```python:batch()
def batch(path):
    item_list = get_itemlist(path)
    for item in item_list:
        if " " not in item:
            change_name(item)
        else:
            pass
    os.chdir("/../../../content")
```
先に作成した二つの関数と、繰り返しおよび条件分岐を使うことで、名前を変更していないファイルを一括で変更できるようにしています。
条件分岐では、ファイル名変更の有無をスペースの有無で行なっています。
os.chdir()で作業ディレクトリをプログラム実行前と同じディレクトリに戻しています。

```:ファイル名の違い
変更前：　　　　[文字列1]_[文字列2]_[番号].[拡張子]
変更後：[番号]␣[文字列1]_[文字列2]_[番号].[拡張子]
```

```:擬似コード
def batch(作業したいディレクトリのパス):
    ファイル一覧を取得
    ファイル一覧の中から、ファイル名を一つずつ取り出して繰り返す:
        スペースの有無でファイル名の変更有無を判別、ファイル名変更前の場合:
            ファイル名を変更する
        ファイル名変更後の場合:
            何もしない
    作業ディレクトリをプログラム実行前同じディレクトリに戻す
```

#おわりに
ローカルな環境からDriveを操作しようとすると、外部ライブラリが必要になるようですが、Colaboratoryを使うと、ローカルな環境と同様にosモジュールを使ってファイル操作をすることが可能です。ColaboratoryはDriveをPythonから操作するときの便利な一手となりうるかもしれません。

P.S.
筆者初めての投稿です。至らないところ等ありましたらご教授いただけたら幸いです。

#参考
[Google colaboでGoogle DriveのファイルをPythonで操作する](https://qiita.com/jooji/items/a12405ab0e9a15125140)