拡張子一括変換

#概要
「python 拡張子一括変換」で検索して出てくるサンプルが、欲しいものと違ったため作成。
備忘録的に投稿。
暗記できるくらい短いものが欲しかったので、↓を一番上にもってきときます。

#コード - 暗記用

```python
from pathlib import Path
for f in Path('.').rglob('*.docm'):
    f.rename(f.stem+'.doc')
```

[pathlibのマニュアル][3]を読んでたら、renameメソッドがあることに気がつきました。


#その他の実装例
##コード1 - 初回版
".docm" ⇒ ".doc"に決めうち変換。 
ipythonでカレントディレクトリ変更したあと実行。

```python
import pathlib
import shutil
files = list(pathlib.Path('.').rglob('*.docm'))
for i,f in enumerate(files):
    print("{0}/{1}".format(i+1,len(files)))
    shutil.copy(f, f.with_name(f.stem + ".doc"))
```

##コード2 - コピー作らない版
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">変換じゃなくてコピーやないかーい(´・ω・｀)</p>&mdash; てらモス (@termoshtt) <a href="https://twitter.com/termoshtt/status/991166072865734656?ref_src=twsrc%5Etfw">2018年5月1日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">拡張子一括変換 on <a href="https://twitter.com/Qiita?ref_src=twsrc%5Etfw">@Qiita</a> <a href="https://t.co/umtj47YCJQ">https://t.co/umtj47YCJQ</a></p>&mdash; てらモス (@termoshtt) <a href="https://twitter.com/termoshtt/status/991165961137868800?ref_src=twsrc%5Etfw">2018年5月1日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

というコメントがあったのでshutil.moveに書き換え

```python
import pathlib
import shutil
files = list(pathlib.Path('.').rglob('*.docm'))
for i,f in enumerate(files):
    print("{0}/{1}".format(i+1,len(files)))
    shutil.move(f, f.with_name(f.stem + ".doc"))
```

##コード3 - 進捗1行表示版
コード2(コピー作らない版)に加えて、[Pythonで、進捗バーを自作する - naritoブログ][7]を参考に進捗を1行に表示。f-stringを利用。



```python
import pathlib
import shutil
files = list(pathlib.Path('.').rglob('*.docm'))
prev_len=0
for i,src in enumerate(files):
    dest=src.with_suffix('.doc')
    print(f'\r{" "*prev_len}', end='') #前回の残像をスペースで消す
    progress=f'{i+1}/{len(files)}:{src.name} -> {dest.name}'
    print(f'\r{progress}',end='')
    shutil.move(src,dest)
    prev_len=len(progress)
print()
```

##コード4 - @shiracamusさん版(関数化)
```
#!/usr/bin/env python3.6
# -*- coding:utf-8 -*-

import sys
import pathlib
import shutil

def rename_ext(path, ext_before, ext_after, verbose=True):
    files = list(pathlib.Path(path).rglob(f'*.{ext_before}'))
    total = len(files)
    for count, before in enumerate(files, 1):
        after = before.with_name(f'{before.stem}.{ext_after}')
        verbose and print(f'{count}/{total}: {before} -> {after}')
        shutil.move(before, after)

if __name__ == '__main__':
    cmd, *args = sys.argv
    if len(args) != 3:
        print(f'Usage: {cmd} <path> <ext_before> <ext_after>')
        sys.exit(1)
    rename_ext(*args)
```

#参考
##「python 拡張子一括変換」で検索して出てくるサンプル
[Python - pythonで、ファイルの拡張子を変換してみたい。(11335) - teratail][2]
[Pythonでファイル名の前後に文字列や連番を加えて一括変更 Python _ note.nkmk.me][5]
[Pythonで複数のファイルの名前を一括変換する方法を教えてくだ... - Yahoo!知恵袋][6]

##作るときにみた記事
[11.1. pathlib — オブジェクト指向のファイルシステムパス — Python 3.6.5 ドキュメント][3]
[Python - file, pathlibメモ - 何かできる気がする][1]
[Pythonで、進捗バーを自作する - naritoブログ][7]

##関連記事
[フォルダごとに階層化されていたファイルをフラットにしながらコピーする - Qiita][4]


[1]:https://dekirukigasuru.com/blog/2017/02/04/python-file-pathlib/
[2]:https://teratail.com/questions/11335
[3]:https://docs.python.jp/3/library/pathlib.html
[4]:https://qiita.com/int_main_void/items/fd007d4c0ff7e84aae38
[5]:https://note.nkmk.me/python-os-rename-glob-format-basename-splitext/
[6]:https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11139699101
[7]:https://torina.top/detail/263/