파이썬은 텍스트 처리에 유용한 다양한 기능을 제공하는
인기 있는 프로그래밍 언어입니다.
특히 정규 표현식(re) 모듈을 사용하면
복잡한 문자열 패턴을 쉽게 찾고 바꿀 수 있습니다.
이번 포스트에서는 파이썬과 정규 표현식을 사용하여
텍스트 파일의 공백을 제거하는 방법에 대해 알아보겠습니다.
위와 같은 형태의 gui를 만들고
버튼을 누르면 txt 파일을 선택할 수 있는 창이 뜨고
파일을 선택한 후
공백제거가 완료되면 자동으로 저장할 수 있는 창이 생성이 되는 코드입니다.
사용할 모듈은 tkinter와 re 모듈입니다.
먼저 필요한 모듈을 모두 import 합니다.
import tkinter as tk
from tkinter import filedialog
import re
먼저 버튼을 하나 만들겠습니다.
import tkinter as tk
from tkinter import filedialog
import re
if __name__ == "__main__":
root = tk.Tk()
save_button = tk.Button(root, text="파일 열기 / 저장", command=save_file)
save_button.pack(padx=5, pady=5)
root.mainloop()
[ if __name__ == "__main__": ] 에 대한 설명은 여기를 참고하세요
위 코드는
버튼을 하나 만들고, 버튼에 [ 파일 열기 / 저장 ]이라는 텍스트를 보여줍니다.
그리고 버튼을 클릭하면 [ save_file ]이라는 함수가 호출됩니다.
위에서 버튼을 누르면 파일을 선택할 수 있는 창이 나타난다고 했습니다.
이제 파일을 선택할 수 있는 창이 나타나고
파일을 선택하면
공백을 제거하는 코드를 작성해 보겠습니다.
함수 이름은 [ open_file() ]로 하겠습니다.
def open_file():
file_path = filedialog.askopenfilename(filetypes=[("Text Files", "*.txt"),])
if file_path:
with open(file_path, "r", encoding="utf-8", errors='ignore') as file:
file_content = file.read()
file_content = re.sub(r'\s{2,}', ' ', file_content)
return file_content, file_path.split(".")[-1]
먼저 askopenfilename() 메서드를 통해 파일타입이
txt 확장자인 파일을 열 수 있도록 합니다.
만약에 파일의 경로가 제대로 선택이 되었다면
파일을 열고 file_content에 해당 내용을 저장합니다.
with open(file_path, "r", encoding="utf-8", errors='ignore') as file:
file_content = file.read()
그리고 난 후 다시 file_content를 읽어 들여
공백을 제거를 한 후 다시 file_content에 저장합니다.
file_content = re.sub(r'\s{2,}', ' ', file_content)
그리고 파일의 내용[ file_content ]과 파일의 확장자[ file_path.split(".")[-1] ]을 반환합니다.
return file_content, file_path.split(".")[-1]
[ file_path.split(".")[-1] ] 이것을 조금 더 자세히 설명하면
file_path에는 파일의 경로가 들어 있습니다.
C:\Program Files\aaaa.txt
이런 경로가 있을 경우 [ . ]로 문자열을 나눕니다.
그 중 [ -1 ]번째 즉 나누어 진 것의 맨 마지막 것을 의미합니다.
맨 마지막 것이면 [ txt ]이며 확장자를 의미하게 됩니다.
이제 공백을 제거하겠다는 목적은 달성을 했습니다.
마지막으로 공백을 모두 제거한 파일을
저장하는 기능입니다.
def save_file():
file_content, extension = open_file()
if file_content and extension:
file_path = filedialog.asksaveasfilename(defaultextension=extension, filetypes=[("Text Files", "*.txt"), ])
if file_path:
with open(file_path, "w", encoding="utf-8") as file:
file.write(file_content)
save_file() 함수에서는 open_file() 함수를 호출합니다.
open_file() 함수를 호출하면, 공백을 제거하는 기능을 수행한 후
공백을 제거한 내용과 확장자를 반환합니다.
그것을 save_file() 함수에서 file_content, extension 변수에 각각 저장합니다.
이제 asksaveasfilename() 메서드를 통해 [ 다른이름으로 저장하기 ] 기능을 수행한 후
파일의 경로가 정상이라면
해당 내용을 파일에 써줍니다.
다음은 전체 소스코드입니다.
import tkinter as tk
from tkinter import filedialog
import re
def open_file():
file_path = filedialog.askopenfilename(filetypes=[("Text Files", "*.txt"),])
if file_path:
with open(file_path, "r", encoding="utf-8", errors='ignore') as file:
file_content = file.read()
file_content = re.sub(r'\s{2,}', ' ', file_content)
return file_content, file_path.split(".")[-1]
def save_file():
file_content, extension = open_file()
if file_content and extension:
file_path = filedialog.asksaveasfilename(defaultextension=extension, filetypes=[("Text Files", "*.txt"), ])
if file_path:
with open(file_path, "w", encoding="utf-8") as file:
file.write(file_content)
if __name__ == "__main__":
root = tk.Tk()
save_button = tk.Button(root, text="파일 열기 / 저장", command=save_file)
save_button.pack(padx=5, pady=5)
root.mainloop()
마지막으로 가장 오늘 블로그에서 가장 중요한 코드인
file_content = re.sub(r'\s{2,}', ' ', file_content)
이 부분에 대해 조금 더 설명하겠습니다.
re 모듈의 sub() 메서드는 file_content 안에 있는 [ r'\s{2,}' ] 을 [ ' ' ]으로 바꾸어라 라는 의미입니다.
[ \s ]는 공백을 의미하는 정규표현식입니다.
공백은 스페이스가 될 수도 있고, 탭이 될 수도 있고, 줄바꿈이 될 수도 있습니다.
이것들이 [ {2, } ] 즉, 두번 이상 연속된다면, [ ' ' ]하나의 공백으로 바꾸라는 의미입니다.
정규표현식은 다음에 한번 다뤄볼 수 있도록 하겠습니다.
※ tkinter 모듈의 파일 선택창 열기에 대한 블로그입니다.
여기를 방문하시면 더 많은 파이썬 관련 자료를 확인할 수 있습니다.
'파이썬(Python)' 카테고리의 다른 글
[ Basic ] 파이썬 가상환경을 사용하는 이유와 가상환경 설정방법 (0) | 2023.03.27 |
---|---|
[ Basic ] 파이썬 for 문에 대한 다양한 활용 (0) | 2023.03.24 |
[ Basic ] 파이썬 with 구문 : with ~ as (0) | 2023.03.17 |
[ Basic ] 파이썬 if __name__ == "__main__" 구문 (0) | 2023.03.16 |
[ Basic ] 파이썬(python) lambda 함수 (0) | 2023.03.09 |