pythonの学習記録1

今はシェルスクリプトしか使えないのですが、サーバーエンジニアとして仕事の幅を広げたいため、今日からpythonを学習したいと思います

環境

練習で作成するスクリプト

下記のテキストの「dddd」を「abcd」,「efgh」の2行に置換するスクリプト

aaaa
bbbb
cccc
dddd
eeee

処理の流れ

  • 引数で入力ファイル名、一時ファイル名、置き換える内容を記載したファイル名を指定
  • 入力ファイルを日付つき(.YYYYMMDD)でバックアップ
  • 入力ファイルを一行ずつ読み込み
    • ddddと一致したら置き換える内容を記載したファイルの内容を一時ファイルに書き込む
    • 一致しない場合は入力ファイルの内容をそのまま書き込む
  • 入力ファイルと一時ファイルの差分を表示する
  • 一時ファイルを入力ファイルに上書きして良いか確認するよう表示し、入力を待つ
  • 確認に「y」が入力された場合一時ファイルを入力ファイルに上書きする

作成したスクリプト

#!/usr/bin/python

import sys
import datetime
import shutil
import difflib
import re

src_file = sys.argv[1]
tmp_file = sys.argv[2]
add_file = sys.argv[3]
bk_file = src_file + "." + datetime.date.today().strftime("%Y%m%d")


## Backup
shutil.copy(src_file, bk_file)

## Modify
pattern = re.compile('dddd')
f1 = open(src_file, 'r')
f2 = open(tmp_file, 'w')
f3 = open(add_file, 'r')

while 1:
   s = f1.readline()
   if not s:
      break
   if pattern.match(s):
      add_list = f3.readlines()
      for add in add_list: 
          f2.write(add)
   else:
      f2.write(s)

f1.close()
f2.close()

## Diff 
f1 = open(src_file, 'r')
f2 = open(tmp_file, 'r')

a = f1.readlines()
b = f2.readlines()

for buf in difflib.context_diff(a, b,n=0):
   print buf

f1.close()
f2.close()


## Confirm
user_input = raw_input("Ovewrite?(y/n)") 


## Overwrite
if user_input == "y":
   print "Copy " + tmp_file + " To " + src_file
   shutil.copy(tmp_file, src_file)
   sys.exit(0)
else:
   sys.exit(1)