27章「使用頻度の高いコーディングテクニック」を勉強中です。そろそろこの「初めてのPython」も終わりなので、次なる勉強方法を真剣に考えておかないと。
—–
27章にファイルやディレクトリの扱いが載っていたので、仕事でたまに必要となる「指定したファイルを全てリネーム」というプログラムを作ってみる。例えばDOSコマンドなんかだと、rn *.txt *_bk.txtとやっても、.txtファイルを全てリネームしてくれるというよな動作にはならないので、プログラムではそれを出来るようにする。
以下のrename.pyは、指定したファイル群を○○_bk.txtのようにリネームしてくれる。引数としてファイルを指定すればそれがリネームされるし、何も指定しなければカレントディレクトリの全てが作業対象となる。
rename.py
import sys, os, glob def makeNewName(filename, suffix): t = os.path.splitext(filename) newfilename = t[0] + suffix + t[1] return newfilename if len(sys.argv) == 1: filenames = [item for item in os.listdir(os.curdir) if os.path.isfile(item) == True] del filenames[filenames.index(os.path.basename(sys.argv[0]))] else: filenames = [item for arg in sys.argv[1:] for item in glob.glob(arg)] #making new file names newfilenames = map(makeNewName, filenames, ['_bk'] * len(filenames)) #execute map(os.rename, filenames, newfilenames)
全てのファイルを作業対象にした場合は、そこに自分自身(rename.py)が含まれないように注意する。glob.blog(arg)を行うことで、*.txtというような記述方式に対応する。本来ならばリネーム時の接尾語の指定が出来たり、それを戻したりする機能も必要なんだろうけど、とりあえず今回はここまで。
実行方法(.txtファイルを全てリネームする場合)。
C:\Python24>python.exe rename.py *.txt