본문 바로가기

TroubleShooting/Etc

텍스트 파일에서 특정 문자열만 변경하는 파이썬(Python) 코드

728x90

텍스트 파일에서 특정 문자열만 변경하는 파이썬(Python) 코드


텍스트 파일 내에서 특정 문자열들을 변경하는 방법은 쉘 스크립트로 한다면 여러가지 방법이 있을 것이다.

그런데, 리눅스에서만 실행하는게 아니라 윈도우에서 동일하게 실행을 하려고 해서 방법을 찾아보니 파이썬으로 하면 되겠더라.


MySQL DB 백업 후, 새로운 서버로 옮기거나 데이터 이동을 할때 생성되는 쿼리문이 있다.


DROP TABLE IF EXISTS AnimChangeList;

CREATE TABLE AnimChangeList (

`ACId` INT

 PRIMARY KEY

,`BeforeAnimName` MEDIUMTEXT

,`CurrentAnimName` MEDIUMTEXT

,`NextAnimName` MEDIUMTEXT

,`IsTestData` TINYINT

)

ENGINE = INNODB CHARACTER SET UTF8;



INSERT INTO AnimChangeList(`ACId`,`BeforeAnimName`,`CurrentAnimName`,`NextAnimName`,`IsTestData`) VALUES 

('1','sitchairstart01','love01','sitchairstart01','0'),

('2','sitchairstart01','angry01','sitchairstart01','0'),

('3','sitchairstart01','cry01','sitchairstart01','0')'

...


DROP TABLE IF EXISTS B_table;

CREATE TABLE B_table (

`bId` INT

 PRIMARY KEY

,`name` MEDIUMTEXT

)

ENGINE = INNODB CHARACTER SET UTF8;


INSERT INTO B_table(`bId`,name`) VALUES 

('1','love01'),

('2','angry01'),

('3','cry01'),

...


 위에 쿼리문을 보면 항상 테이블 생성(CREATE TABLE) 전에 존재하는지 확인 후 지우고 있다(DROP TABLE IF EXISTS).

 하려고 하는 시나리오는 테이블을 삭제하지 말고,기존 테이블을 다른 이름으로 바꾸고 새로운 테이블을 생성하고 데이터를 입력하려고 한다.

테이블 이름을 변경하는 명령(RENAME TABLE) 을 추가하면 되는데, "DROP TABLE" 로 시작하는 쿼리문만 바꾸면 된다는 것을 알아냈다. 나머지는 그대로 사용하기로 한다.


import sys

import string

import re


# Pleaese, Use python 2.7 becasuse of encoding issue.


if len(sys.argv) != 3:

print("usage : " + sys.argv[0] + " [convert file] [new_table_postfix] > converted_filename")

sys.exit(1)

else:

fname = sys.argv[1]

date_input = sys.argv[2]


f = open(fname, "r")

lines = f.readlines()


pattern = '^DROP.*'

r = re.compile(pattern)

for each_line in lines:

if r.search(each_line):

arr = each_line.split()

old_table = arr[4]

index = old_table.find(';')

old_table = old_table[0:index]

new_line = "\nRENAME TABLE {0} TO {0}_{1};".format(old_table, date_input)

print(new_line)

else:

print(each_line.strip('\n'))


f.close()


간단히 설명하자면, 파일의 전체줄을 하나씩 읽어서 "DROP" 시작하는(^) 라인을 찾으면("DROP TABLE IF EXISTS B_table;") 분리해서 테이블 명을 알아낸다.(split(), old_table[0:index]) 그 다음에 새로운 문자열(RENAME TABLE {0} ...) 을 formatting 해서 표준 출력(print) 으로 콘솔 화면에 출력한다. usage 에서 마지막 인자인 "converted_filename" 파일에 리다이렉트(>)로 내보낸다. 리다이렉트를 안하고 새로운 출력파일에 바로 write 를 하면 되는데, 더 개발하는거를 포기하는 바람에 이렇게 작성되었다.


실행 방법은 다음 순서로 한다. postfix 에는 실행하는 날짜가 매번 틀려서 날짜를 이용했다.


# 실행할 파이썬 이름 [변경할 파일명] [변경되는 테이블이름에 붙는 postfix] > [새로운 파일명]


ex) change.py backup.sql 20170810 > backup_20170810.sql


실행 후, 변경된 파일을 열어보면 "RENAME TABLE AnimChangeList TO AnimChangeList__20170810;" 이런식으로 변경되어 있을 것이다.