条件に合致するファイルを連続して読み込み,処理後にファイル名を変えて保存

コード

code.py
文字列 "hogehoge" を含むテキストファイル filename{1,2,3,...}.txt に対し,該当文字列を "hugahuga" に置換する処理を行う.
処理後のファイルは filename{1,2,3,...}_huga.txt の名前で保存する.

# /usr/bin/python
#! coding: utf-8

import sys
import os

filenames = sys.argv[1:]

for file in filenames:
	f = open(file, "r")
	if os.path.exists(file.rstrip(".txt" + "_huga.txt")):
		os.remove(file.rstrip(".txt" + "_huga.txt"))
	for line in f:
		line = line.rstrip()
		line = line.replace("hogehoge","hugahuga")
		target = open(file.rstrip(".txt" + "_huga.txt"), "a")
		target.write(line)
	target.close()
f.close()

実行

$ python code.py */*/filename*.txt

説明

import sys
filenames = sys.argv[1:]

コマンドライン引数の取得などを行うsysモジュールをインポートし,コマンドライン引数をsys.argvで取得する.
sys.argvはリスト形式でコマンドラインに入力された文字列を格納し,sys.argv[0]には実行したpythonファイル名が入る.
ワイルドカードでファイル名を指定してsys.argvで受けた場合,該当するファイルパスがすべてリストの要素として格納される.
従って,filenames = sys.argv[1:]は,該当するすべてのファイルパスのリストになる.

for file in filenames:
	f = open(file, "r")

リスト filenames について,要素の一つ一つを連続して処理する.
ここでの処理は,open関数にfilenameの要素であるファイルパスを渡し,読み出しモード "r" で開く,というもの.

	if os.path.exists(file.rstrip(".txt" + "_huga.txt")):
		os.remove(file.rstrip(".txt" + "_huga.txt"))

os.path.exists()は,指定したファイルが存在するかどうかを調べる関数.
if文に組み込んで使うと,もし存在する場合はifブロックの処理が実行される(trueを返す).
存在するかどうか調べているのは,出力予定のファイル名(拡張子をrstrip(".txt")で削除し,"_hogehoge.txt" を追加している).
ここでの存在する場合の処理は,その名前のファイルを消す,というもの.
この処理はファイルへの書き込みの処理の前に行う必要がある.

	for line in f:
		line = line.rstrip()
		line = line.replace("hogehoge","hugahuga")

最初のfor文のひとつひとつの処理で開いているファイルについて,入れ子にしてfor文を実行する.
処理単位は行ごとになる.
line = line.rstrip()で,行末の空白文字(改行)を削除.
line = line.replace("hogehoge","hugahuga")で,"hogehoge" を "hugahuga" に置き換え.

		target = open(file.rstrip(".txt" + "_huga.txt"), "a")
		target.write(line)
	target.close()
f.close()

target(変数名はなんでもよい)に,書き込む予定のファイルを開く操作を行う.
上の処理で存在するかどうか調べた名前のファイルを,モード "a" で開く(追記モード).
同じファイル名のファイルは存在しないことが確認されている(あったら消されている)ので,実際には新規作成している.
開いた上で,target.write(line)で,line(二番目のfor文のひとつひとつの処理結果)をファイルに書き込む.
処理が終わったら.close()でファイルを閉じる.

要点

fileはコマンドラインから得られたただの文字列なので,文字列に対する操作(rstrip())ができる.
これにより,読み込んだファイル名を利用して新たなファイル名を自動的に生成できる.
先にその名前のファイルがないかどうか調べ,あったら消しておくのも重要.
そうしないと処理するたびに元のファイルに追記されてしまう.