Python 学習ノート #1【自動ファイル名変換】

# 1.きっかけ

Wordの本を読みながらPCで実際の操作を学習していた。
しかし、キーボードを両手で打つと手が離れてしまい、本がめくれるなど不便なことばかり。
よって非破壊自炊法により、本をイメージ化することに成功した。（[参考](https://follow-myheart.com/archives/990)）

実際の画像はこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2502107/6f23e716-eacf-393a-3933-bf166ae20dfc.png)

それらを用いた実際の学習環境は以下のようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2502107/5cd89c8f-dc00-6a74-17d7-cd715dd3a9d1.png)


今は６画面を用いて作業しているのでとても楽に作業ができる。
モニターリソースとしては以下のように使用している。

1.フォルダ用
2.問題確認用
3.操作手順、回答確認用
4.Qiita執筆用
5.Word操作用
6.調査用

しかし、ここで問題が発生。
ファイル名がスクリーンショットからの保存なのでとても機械的な名前でとても気になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2502107/7c3d889e-5700-c551-7bc1-59a541c6f4b0.png)


そこで、いい機会なので自動でファイル名を変更するプログラムを作成していこうと思う。

# 2.作成
目的としては、フォルダ内に含まれる画像ファイルを全部連続した数字に零埋めをして表示出来たらうれしいなと思っています。

## 2-1.ファイルリストを取得してみる。
まず真っ先に必要になってくると考えられるのがglob
とりあえずインポートしておきます。

そこでとりあえずファイルが選択できるか検証してみます。

```Auto_Name_Changer.py
import glob

file_list=glob.glob(input()+"./*")
print(file_list)
```
実行後の画面：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2502107/25d4e278-8839-9713-7381-9599ec7da0ad.png)

とりあえずすべてのファイルを取得したリストが出来上がりました。

## 2-2.ファイルリストを「jpg」のみにする。
しかし、これでは、今回のプログラムなどのように、ほかのファイルなどがあったときに干渉してしまうので、拡張子が「.jpg」のファイルのみに反応するようにします。

```Auto_Name_Changer.py
import glob

file_list=glob.glob(input()+"./*.jpg")
print(file_list)
```
実行後の画面：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2502107/5d842563-888e-d66b-b4a5-a8dd71016543.png)

これで画像のファイルリストが出来上がりました。

ここでファイルの指定についてちょっと考えます。
しかし、毎回ファイルを指定するのはとっても面倒なので、そのソースコードを置いてある場所の命名をできるプログラムにします。
毎回ファイルを指定したい場合は、変数Pathを用意してあげてすべてのファイル指定系の先頭に付与してあげれば可能です。

## 2-3.ファイルの件数確認
次に何件あるか確認するコードも付属させてみます。

```Auto_Name_Changer.py
import glob

file_list=glob.glob(input()+"./*.jpg")
print(("\n").join(file_list))
print("{}件のファイルが選択されました。".format(len(file_list)))
```
実行後の画面：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2502107/6c61fc24-4d4b-f4b3-3089-b374bd5ee6b1.png)

## 2-4.柔軟に使用できるように応用

このプログラムを使用して、変更したいのは画像ファイルです。
しかし、全部のファイルに対応できたらもっと便利なので、正規表現を用いて適宜変更するようにします。
(スクリーンショットが見ずらいかもしれないので、ファイルやツリー形式を添付後以降コードのみの表示に切り替えます。)
現在のファイル状態：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2502107/73cdc751-a382-f468-3796-82fc4087aab2.png)

```Auto_Name_Changer.py
import glob

#ファイル選択
print("例）./*.jpg\t./*.docx")
file_selecter=input("改名したいファイルの選択方法を正規表現で==>")
file_list=glob.glob(file_selecter)
print(("\n").join(file_list))
print("{}件のファイルが選択されました。".format(len(file_list)))
```
実行後の画面：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2502107/343aac09-757d-9307-78b8-fd8a08f6c021.png)

これでJPG以外のファイルにも適宜入力値を変更することで対応できるようになりました。

## 2-5.ファイルの改名の前準備

実際にプログラムを実行して得られたfile_listをもとに考えていきます。
file_listをもとにしたforを作成し、その後零埋めのためのformatを使用して対応。
実際に変更される前にどうなるか表示してくれたほうが安心するので、それも組み込みます。

```Auto_Name_Changer.py
import glob

# ファイル選択
print("例）./*.jpg\t./*.docx")
file_selecter=input("改名したいファイルの選択方法を正規表現で==>")
file_list=glob.glob(file_selecter)
print("{}件のファイルが選択され、以下のように変更されます。".format(len(file_list)))

# ファイル改名準備
for i in range(len(file_list)):
    file_name=("{:03}.jpg".format(i+1))
    print("{} ==> {}".format(file_list[i],file_name))
```
（ここからは、プログラムのスクショが邪魔なので省きます。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2502107/4ef450a0-6c8f-d417-5d67-0b1adb55fccf.png)

## 2-6.確認処理

- yを押したら、改名処理へ
- nを押したら、終了処理へ

という形にユーザー処理を組み込みます。

```Auto_Name_Changer.py
import glob

# ファイル選択
print("例）./*.jpg\t./*.docx")
file_selecter=input("改名したいファイルの選択方法を正規表現で==>")
file_list=glob.glob(file_selecter)
print("{}件のファイルが選択され、以下のように変更されます。".format(len(file_list)))

# ファイル改名準備
for i in range(len(file_list)):
    file_name=("{:03}.jpg".format(i+1))
    print("{} ==> {}".format(file_list[i],file_name))

flag=input("変更しますか(y/n)=>")
if flag=='y':
    print("改名開始")
    #改名処理
if flag=='n':
    print("終了")
    #終了処理
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2502107/783a70a9-9505-b818-7405-b54bb23dd8e7.png)

これで「y」を押したら改名処理を実行する。
「n」を押したら終了処理に分岐するユーザー任意の処理の導入が完成しました。

## 2-7.改名処理

osをimportして、それぞれのファイルをformatで零埋めした命名規則に従い変更していきます。
それと、先ほどのテストで分かったことですが、入力が2回もあると結構面倒です。
なので、ファイルの改名開始はEnterが入力されるかそれ以外かに変更します。
改名方法はos.rename(元のファイル名,変更後のファイル名)
なので、元のファイル名に、読み込んだファイル。
変更後のファイル名にはformatを使用して変更したい名前に変更しました。
改名処理を行わない場合の退避処理はexitにしました。

```Auto_Name_Changer.py
import glob
import os

# ファイル選択
print("例）./*.jpg\t./*.docx")
file_selecter=input("改名したいファイルの選択方法を正規表現で==>")
file_list=glob.glob(file_selecter)
print("{}件のファイルが選択され、以下のように変更されます。".format(len(file_list)))
 
# ファイル改名準備
for i in range(len(file_list)):
    file_name=("{:03}.jpg".format(i+1))
    print("{} ==> {}".format(file_list[i],file_name))


flag=input("変更しますか(Enter/Other)=>")
if flag=='':
    for i in range(len(file_list)):
        file_name=("{:03}.jpg".format(i+1))
        os.rename(file_list[i],file_name)
else:
    exit()
```

# 3.実行結果
完成したプログラムを実際に動かした動画を撮影してみました。
自身の業務効率化にまた一歩貢献出来ました。

<iframe width="926" height="579" src="https://www.youtube.com/embed/bHGug4yrQ-w" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

実行後の画面のスクリーンショットは以下のものになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2502107/88182faf-9350-7e68-4923-ba9374accb3d.png)