본문 바로가기
Python

파이썬 파일 특정 값 변경 방법, Replace 함수 사용법 및 코드 (Python)

by 무적물리 2020. 3. 22.

작성한 내용과 동일하지만 더 간단한 코드를 작성해서 다른 포스팅에 작성하였습니다. 아래 글에서 확인할 수 있습니다. 이번 글을 그냥 참고 정도로만 활용하셔도 되겠습니다.






수치 최적화 문제를 풀거나 시뮬레이션을 머신러닝에 활용하기 위해서 시뮬레이션의 변수로 사용된 값을 바꾸어줘야할 때, 해당 변수를 찾아서 원하는 값을 바꿔줘야합니다. 이러한 상황에서 해당 파일을 열어서 해당 값을 찾고 바꿔서 저장하는 것은 불가능에 가깝습니다. 몇개 정도는 그냥 하면 되지만 몇 천개, 몇 만개 단위로가면 말이죠. 


이 때, 파이썬이나 기타 컴퓨터 언어를 활용해서 파일 내 원하는 변수를 찾아서 원하는 값으로 변경해주는 코드를 작성해서 몇초만에 해당 업무를 끝낼 수 있습니다. 이번 포스팅에서는 가장 활용하기 쉬운 언어인 파이썬을 활용해서 바꾸고 싶은 변수를 찾아서 원하는 값으로 바꿔보겠습니다. 웬만한 텍스트 파일은 모두 가능하며 심지어 파이썬 파일도 가능한 방법이니 참고하시면 좋겠습니다.




예제 설명

기준으로 삼아서 설명하고하는 예제는 텍스트 파일의 변수 a와 b에 설정된 값을 다른 값으로 바꿔주는 예제입니다. 한개의 변수만 바꾸는 예제는 너무 쉽기 때문에 이와 같은 예제를 구성했습니다. 실제로 시뮬레이션을 하고 최적화를 하기 위한 데이터베이스를 쌓을 때, 자주 사용하고 있는 방법입니다. 남들이 손으로 몇시간 걸리는 일을 몇 초만에 할 수 있는 소프팅 파워를 가질 수 있으니 잘 활용하면 좋습니다.



위 그림과 같이 'test1.txt'와 'test2.txt'는 동일한 내용의 파일입니다. 여기서 a=1, b=2 라고 선언된 값을 찾아서 바꾸는 예제를 풀어보고자합니다. 각 파일에서 변환될 내용은 아래와 같습니다.


test1.txt

a = 1 → a = 2

b = 2 → b = 3


test2.txt

a = 1 → a = 5

b = 2 → b = 6



패키지 선언

예제를 풀기 위한 유용한 패키지는 없고 파이썬 내장 함수를 사용해서 해당 예제를 풀어볼까합니다. 패키지는 하나가 선언되는데, Temp. 파일 제거를 위한 os 패키지 입니다.


import os


파일 선언

바꾸고자하는 파일의 위치와 이름을 선언해줘야합니다.  파일의 위치는 복사, 붙여넣기를 하면 역슬래쉬로 되어 있지만, 슬래쉬로 바꾸어주도록 합니다. 또한, 파일은 'test1.txt', 'test2.txt'를 불러올 것이기 때문에 숫자는 변수로 취해주어야합니다. 따라서 파일명은 'test'만을 가져가겠습니다.


Location = "C:/Users/s410/Desktop"

File = "test"


변수 선언

파일에서 바꾸고자 하는 값과 바꾸려는 값을 선언해줍니다. 바꾸고자하는 값은 'a=1', 'b=2'이며 바꾸려는 값은 위에서 설명한 바와 같습니다. 이때, 파일명을 for문을 통해서 가져와야하기 때문에 [1, 2]의 리스트를 만들어서 변수화해주었습니다.


Find_Value_a = 1

Find_Value_b = 2


Num = [1, 2]

Change_Value_a = [2, 5]

Change_Value_b = [3, 6]


위에서 선언한 변수를 간단히 설명하자면, 바꾸고자 하는 값은 'Find_Value_a/b' 입니다. 'Num'리스트는 Iteration 번호입니다. 'Change_Value_a/b'는 바꿀 값입니다. 파일에서 'Find_Value_a/b'의 뒤에 선언된 숫자를 찾아서 'Change_Value_a/b'로 변경해주며, 그 때의 숫자는 'Num'으로 정의됩니다.


변수 리스트 만들기

변수를 for문에서 사용하기 위해서는 리스트로 만들어줘야합니다. tcl 같은 언어에서는 foreach문을 지원함으로써 편하게 사용가능하지만 파이썬에서는 아래와 같은 형태로 변수 리스트를 만들어줘야 합니다.


Variables = [(Num[x], Change_Value_a[x], Change_Value_b[x]) for x in range(0, len(Num))]


처음에는 어렵게 느껴지지만 사용하다보면 간편한 방법이며 한줄로 리스트를 만들수 있는 좋은 방법입니다. 의미는 Num, Change_Value_a, Change_Value_b의 변수를 앞에서부터 차례대로 가져와서 리스트를 만듭니다. 실행하면 아래와 같은 결과를 생성합니다. 현재는 예제이기 때문에 리스트의 내용이 2개 밖에 되지 않지만 변수가 많아지면 많아질수록 해당 방법이 빛을 발합니다. 위 함수에서 'len(Num)'은 리스트의 개수를 구하는 방법입니다.


Variables = [ ( 1, 2, 3), (2, 5, 6) ]


변수 찾아서 바꾸기

차례대로 'test1.txt' 파일을 열고 a=1, b=2 변수를 찾아서 숫자만 2, 3으로 바꾸는 코드를 작성해보겠습니다. 위에서 선언한 파일 경로와 변수를 format 함수를 이용해서 치환해줄 수 있습니다. 먼저, a만 찾아서 바꿔주고 임시파일로 저장한 뒤에 임시파일을 불러와서 b를 찾아서 바꿔주고 저장해주는 코드입니다. 


for (n, a, b) in Variables:

    f1 = open("{}/{}{}.txt".format(Location, File, n), 'r', encoding='UTF8')

    f2 = open("{}/Temp_{}{}.txt".format(Location, File, n), 'w', encoding='UTF8')

    for line in f1:

        f2.write(line.replace("a = {}", "a = {}".format(Find_Value_a, a)))

    f1.close()

    f2.close()


    f3 = open("{}/Temp_{}{}.txt".format(Location, File, n), 'r', encoding='UTF8')

    f4 = open("{}/Replace_{}{}.txt".format(Location, File, n), 'w', encoding='UTF8')

    for line in f3:

        f4.write(line.replace("b = {}", "b = {}".format(Find_Value_b, b)))

    f3.close()

    f4.close()


먼저, 1번 파일의 a 변수를 바꾸고 Temp. 파일로 저장한 뒤, b 변수를 바꾸고 저장하는 코드입니다. for문을 통해서 변수 리스트에 선언한 대로 차례로 1번, 2번 파일이 바뀌게 됩니다.


Temp. 파일 삭제

중간에 만든 귀찮은 Temp 파일을 일일히 삭제해주기 귀찮으니 os 패키지를 사용해서 해당 Temp 파일을 삭제해주도록 합시다. 이와 같이 작성하면 완료입니다.


    os.remove("{}/Temp_{}{}.txt".format(Location, File, n))



전체 코드

바탕화면에 위치한 파일들을 바꾸는 코드의 전체입니다. 간단합니다. 다른 방법으로도 이와 같은 효과를 볼 수 있지만, 일단은 가장 이해하기 쉽고 간단한 코드로 작성하였습니다.


import os


Location = "C:/Users/s410/Desktop"

File = "test"


Find_Value_a = 1

Find_Value_b = 2


Num = [1, 2]

Change_Value_a = [2, 5]

Change_Value_b = [3, 6]


Variables = [(Num[x], Change_Value_a[x], Change_Value_b[x]) for x in range(0, len(Num))]


for (n, a, b) in Variables:

    f1 = open("{}/{}{}.txt".format(Location, File, n), 'r', encoding='UTF8')

    f2 = open("{}/Temp_{}{}.txt".format(Location, File, n), 'w', encoding='UTF8')

    for line in f1:

        f2.write(line.replace("a = {}", "a = {}".format(Find_Value_a, a)))

    f1.close()

    f2.close()


    f3 = open("{}/Temp_{}{}.txt".format(Location, File, n), 'r', encoding='UTF8')

    f4 = open("{}/Replace_{}{}.txt".format(Location, File, n), 'w', encoding='UTF8')

    for line in f3:

        f4.write(line.replace("b = {}", "b = {}".format(Find_Value_b, b)))

    f3.close()

    f4.close()


    os.remove("{}/Temp_{}{}.txt".format(Location, File, n))


실행 결과

위와 같은 코드를 작성해서 Run을 하면 'test1.txt'와 'test2.txt' 파일은 그대로 존재하며, 원하는 변수로 바뀐 파일은 파일명 앞에 'Replace_'가 붙어서 자동으로 생성됩니다. 내용을 확인해보시면 우리가 원하는 변수로 바뀐 내용을 확인할 수 있습니다.



마무리

이번에 설명드린 코드는 실제로 현업에서 자주 사용되어 데이터베이스를 만들과 최적화하는 기본 파일로 사용되는 방법입니다. 숙지하시어 시간이라는 비용을 아끼고 휴먼 에러도 감소시킬 수 있도록하면 좋겠습니다.

댓글