Python ファイル内の指定文字列を複数置換して、別名でファイル保存する

'20/07/18更新:書式が一部古かったのを更新
 置換はreplaceメソッドを使用して、str.replace([置換したい文字列], [置換後の文字列])とする。
折角なので、乱数生成の方法についても記載する。
random.randint(下限値, 上限値) # 整数型の場合
random.uniform(下限値, 上限値) # 浮動小数点数型の場合

本プログラムの仕様を説明する。置換元のテンプレートのファイル(下図左)を元に、実行後は複数箇所を置換してファイルを別名で保存する(下図右)。

f:id:HK29:20180318222058p:plain

  実行前のファイルは、下図のようにテンプレートのtemp.txtと、プログラム本体のmakefile.pyの二つ。

f:id:HK29:20180318212152p:plain

 ▼テンプレートファイル(temp.txt)

 置換したいのは、@で囲まれている箇所で複数ある。

abcdefg
12345

No1 = @MY_NO_PATTARN@
No2 = @MY_NO_PATTARN2@

#float random
Random_randint = @MY_RANDOM_RANDINT@
#int random
Random_uniform = @MY_RANDOM_UNIFORM@

path = @MY_PATH@

12345

▼本プログラム(makefile.py)

指定した範囲の連番ファイルを生成し、各ファイル内の置換内容は指定した範囲の乱数を生成する。実行はコマンドラインでargvで引数を受け付ける仕様。置換はreplaceメソッドを使用する。

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import os, sys
import random

def makeFile(path, myInFname, myNum1, myNum2):
    for i in range(int(myNum1), int(myNum2)+1):
        #random float
        myRanR = random.randint(80, 100)
        #random int
        myRanU = random.uniform(-5, 0)
        
        with open("derive_" + myInFname[:-4] + "_" + str(i) + ".txt", "w") as f2:
            with open(myInFname, "r") as f1:
                for row in f1:
                    buf = row.replace("@MY_NO_PATTARN@", str(i)) \
                             .replace("@MY_NO_PATTARN2@", str("{0:03d}".format(i))) \
                             .replace("@MY_PATH@", path) \
                             .replace("@MY_RANDOM_UNIFORM@", str(myRanU)) \
                             .replace("@MY_RANDOM_RANDINT@", str(myRanR))
                    f2.write(buf)
    
if __name__ == '__main__':  # メイン関数。必ず実行される。
    if(len(sys.argv)!=4):
        print("input mismatch")
        print("Usage: python progfile inputfile start_no end_no")
        print("argv element->   0        1         2        3  ")
    
    path = os.getcwd() #currenet directry
    myInFname = sys.argv[1] #inputfilenname
    myNum1 = sys.argv[2] #start no
    myNum2 = sys.argv[3] #end no
    
    makeFile(path, myInFname, myNum1, myNum2)
    
    print("finished")

実行例を下図に示す。コマンドライン(CL)で本体プログラム名 テンプレート名 開始番号 終了番号 の順に打ってエンターキーを押す。

f:id:HK29:20180318212720p:plain

すると、下図のようにテンプレートファイルはそのままに、連番ファイルが3~10で生成され、中身はそれぞれ置換されている(冒頭画像のように)。

f:id:HK29:20180318213031p:plain

以上

<広告>