Pythonで作る役立ちプログラムのソースコードを踏まえてPythonのライブラリや構文などの基礎を解説します。
今回はPython自動化作業として「ファイル操作」の基本を学びます。
指定した文字列を含むフォルダをピックアップし、フォルダ名の指定文字列部分を他の文字列に変換します。
プログラムの全容
機能
フォルダ名中の「変換対象文字列」と「変換後の文字列」を指定してプログラムを走らせるとカレントフォルダにある「変換対象文字列」を含むフォルダ名を全て抽出してその文字列を変換します。
フォルダ名ではなくファイル名を変換したい場合もコードを少し変えるだけでできてしまいます。(変更点を記載していますので参照して下さい。)
ソースコード
import os #1. osモジュールのインポート MyPath='./' Contents=os.listdir(MyPath) clist=[] for f in Contents: if os.path.isdir(f)==True: clist.append(f) X_before='xxx' # 変換対象文字列 X_after='yyy' # 変換後の文字列 for dirName in clist: try: if X_before in dirName: NewName=dirName.replace(X_before,X_after) os.rename(dirName,NewName) except: print(dirName,'は例外')
ここで使われたライブラリ,モジュールや構文を順番に解説します。このままコピペで使えます。
プログラムの流れ
カレントフォルダ内のファイルとフォルダを全て取得する
ソースコード
import os #1. osモジュールのインポート MyPath='./' Contents=os.listdir(MyPath) #2. ContentsはMyPathフォルダ内の全てのファイルとフォルダ Contents #--- Contentsリストの内容確認
アウトプット: カレントフォルダ内の全てのフォルダ/ファイル名
解説
#1. osモジュール
osモジュールにはファイルシステム上のフォルダ/ファイルの操作や情報取得の機能があります。
フォルダ/ファイル名取得にosモジュールのlistdr関数を使いますのでosモジュールをインポートします。
#2. listdir関数
osモジュールの関数で、指定したむフォルダ内のサブフォルダ/ファイル名をリストとして取得できます。
Contents=os.listdir(MyPath)
ContentsはMyPathで指定したフォルダ(今回はカレントフォルダを指定)内の全てのファイルとフォルダ名のリストです。
取得したファイルとフォルダからフォルダのみ抽出する
ソースコード
import os #1. osモジュールのインポート MyPath='./' Contents=os.listdir(MyPath) #2. ContentsはMyPathフォルダ内の全てのファイルとフォルダ Contents #--- Contentsリストの内容確認 # ------- 以下追加 ------ clist=[]# clistという空リストを作る for f in Contents: if os.path.isdir(f)==True:#3. Contentsリストの中身がフォルダかどうか確認する clist.append(f)#4. フォルダならばclistリストに追加する clist#--- clistの中身の確認
解説
for文でContentsリストの中身がフォルダかどうかを次々にチェックし、フォルダであれば新たなclistにリストとして追加します。
#3. os.path.isdir()関数
os.path.isdir(f)
でfが存在するフォルダかどうかを確認し、存在するフォルダならばTrueを返します。
#3’. os.path.isfile()関数
ここでは使っていませんがisdirの代わりにisfileを使えばファイルかどうかを確認する関数になります。ファイル名を変換する場合はこれを使います。
#4. appendメソッド
appendはリストに要素を追加するメソッドです。
clist.append(f)では既存のclistリストにfを新規要素として追加します。
フォルダ名の中の文字列を書き換える
ここまででclistリストに全フォルダ名が登録されました。次に名前に’xxx’という文字列が含まれているフォルダをピックアップしてその文字列を’yyy’に変換します。
ソースコード
# ------- 以下追加 ------ X_before='xxx' # 変換対象文字列 X_after='yyy' # 変換後の文字列 for dirName in clist: if X_before in dirName: NewName=dirName.replace(X_before,X_after)#5. replaceメソッド os.rename(dirName,NewName)#6. os.rename関数
解説
#5. replaceメソッド
文字列に含まれる特定の部分文字列を別の文字列に変換します。
-構文-
org.replace(old,new [,n])
- org: 元の文字列
- old: 変換対象文字列
- new: 変換後の文字列
- n: 変換回数(変換対象文字列が複数含まれている場合、nを指定しないと最初の文字列しか変換しませんので複数変換する場合はnを指定します。)
上記のコードではfor文でclist中のフォルダ名をdirNameに代入し
NewName=dirName.replace(X_before,X_after)
でdirNameに変換対象文字列X_before(=’xxx’)が含まれていたらそれを変換後の文字列X_after(=’yyy’)に変換し、NewNameに代入します。
#6. os.rename関数
フォルダ名を変更します。
os.rename(A,B)
フォルダ名をAからBに変更する。
os.rename(dirName,NewName)
ではdirNameというフォルダ名をNewNameに変更します。
例外処理
上記のようにフォルダ名をNewNameに変更しようとして既に同名のフォルダがあったらFileExistsErrorという構文エラーになってしまいます。このようなエラーを回避するために例外処理を行います。
ソースコード
for dirName in clist: try:#7.1.例外処理 if X_before in dirName: NewName=dirName.replace(X_before,X_after) os.rename(dirName,NewName) except:#7.2.例外処理 print(dirName,'は例外')
解説
#7. try〜except文
try:
処理A
except:
処理B
処理Aの実行中にエラーが検出された(例外が発生した)時に処理Bを行います。
上記のコードではtryで変更しようとするフォルダ名が既に存在して構文エラーが発生したらexceptの処理を行い、「(変更後のフォルダ名)は例外」と出力します。
このように例外処理を事前に組み込んでおくことによってプログラム実行中のエラー停止を回避できます。
まとめ
以上でフォルダ名を変換するプログラムが作れます。しかしこのままではPython環境を持ち、コードを少しいじれないと使うことができません。
そこで誰もがどこでも使えるようにWidgetを用意します。
コメント