Python기초강의강좌, 파이썬기초강의강좌, Python백업프로그램
#030 파이썬 기초 - 문제 해결 Part 3
두 번째 프로그램도 잘 동작했지만, 좀 더 기능을 추가해 봅시다.
입 력
백업을 많이 하고 싶을 때, 많은 백업 파일이 생성되므로 어떤 파일이 어떤 것의 백업인지 구분하기가 너무 어려웠습니다! 예를 들어, 어떤 문서나 프로그램에 큰 변화를 주었을 때 그 내용을 zip 파일의 이름에 추가로 달아 주면 좋을 것 같습니다. 이 문제는 zip 파일을 생성할 때 뒤에 사용자 정의 꼬리말을 달아 주는 기능을 추가하면 쉽게 해결될 것입니다
backup_ver3.py로 저장하세요:
# Filename : backup_ver3.py
# -*- coding:utf-8 -*-
import os
import time
# source 디렉토리 # E:\python_study
# 각자의 프로그램 소스 디렉토리를 지정하면 됩니다.
source = r'E:\python_study'
# backup 디렉토리 # E:\backup
# 각자의 프로그램 백업 디렉토리를 지정하면 됩니다.
# 백업 디렉토리는 미리 생성해 두어야 합니다.
target_dir = r'E:\backup'
# backup directory가 없으면 생성해 준다.
if not os.path.exists(target_dir):
os.mkdir(target_dir) # make directory
# sub directory 용 변수
today = target_dir + os.sep + time.strftime('%Y%m%d')
# zip 파일명
now = time.strftime('%H%M%S')
# 추가 : 사용자 커맨트 입력
comment = input('Enter a comment --> ')
# 파일명 구성
# target = target_dir + os.sep + time.strftime('%Y%m%d%H%M%S') + '.zip'
# 변경 : 사용자 커맨트 추가
if len(comment) == 0:
target = today + os.sep + now + '.zip'
else:
target = today + os.sep + now + '_' +
comment.replace(' ', '_') + '.zip'
# sub directory 확인 후 생성
if not os.path.exists(today):
os.mkdir(today)
print('Successfully created directory', today)
# 타겟 확인
print(target)
# cmd 명령 구성 ( bz c [타겟] [소스] 형태로 구성 )
cmd = 'bz c '
cmd += target + ' '
cmd += source
# cmd 명령 확인
print(cmd)
# 백업 압축실행
os.system(cmd)
# 종료
if os.system(cmd) == 0:
print('Successful backup to', target)
else:
print('Backup FAILED')
▶ 실행 결과 :
C:\Anaconda\envs\study_39\python.exe E:\python_study\backup_ver3.py
File "E:\python_study\backup_ver3.py", line 35
target = today + os.sep + now + '_' +
^
SyntaxError: invalid syntax
▶ 에러 원인
실행시켜 보면 구문 오류가 있다는 메시지가 출력되며, 이것은 위 스크립트가 파이썬의 문법 규칙을 만족하지 않는다는 것을 의미합니다. 파이썬이 출력해 준 오류 메시지를 확인해 보면 어디에서 이 오류가 발생했는지를 알려 줍니다. 따라서 그 줄부터 *디버깅*을 시작해 봅시다.
자세히 살펴보면, 한 개의 논리적 명령줄이 두 개의 물리적 명령줄로 나뉘어 있지만 두 개의 물리적 명령줄이 사실 하나의 명령줄이라는 것을 파이썬에게 알려줄 만한 뭔가가 누락되어 있습니다. 여기서 파이썬은 더하기 연산자 ( + )를 발견했으나 그 논리적 명령줄에 피연산자가 없음을 발견하고는 어떻게 해야 할지 모르는 상황에 처하게 된 것입니다. 이 경우, 두 물리적 명령줄을 하나로 연결해 주기 위해서는 맨 뒤에 백슬래시를 추가해 주어야 한다고 배웠으므로 누락된 백슬래시를 추가해 줍니다. 프로그램에서 문재를 찾고 수정하는 이러한 과정을 '버그 수정'이라고 합니다.
target = today + os.sep + now + '_' + 문장 뒤에 '\'를 추가해서
target = today + os.sep + now + '_' + \ 로 수정하십시오.
target = today + os.sep + now + '_' + \
comment.replace(' ', '_') + '.zip'
▶ 변경 후 실행 결과 :
C:\Anaconda\envs\study_39\python.exe E:\python_study\backup_ver3.py
Enter a comment --> test
E:\backup\20230306\072629_test.zip
bz c E:\backup\20230306\072629_test.zip E:\python_study
bz 7.30(Beta,x64) - Bandizip console tool. Copyright(C) 2022 Bandisoft
Creating archive: E:\backup\20230306\072629_test.zip
... (생략)
Successful backup to E:\backup\20230306\072629_test.zip
▶ 동작 원리
이제 프로그램이 잘 동작합니다!
이제 세 번째 프로그램을 작성할 때 추가했던 사항들에 대해 살펴보도록 합시다. 먼저 input 함수를 통해 사용자의 꼬리말을 입력받은 후, 사용자가 뭔가를 입력했는지 여부를 len 함수를 통해 확인합니다. 만약 사용자가 아무것도 입력하지 않고 enter 키를 입력한 경우 (아마도 특별한 꼬리말이 필요 없는 일상적인 백업을 할 경우에 해당될 것입니다), 이전과 동일하게 처리합니다.
그러나 사용자가 꼬리말을 입력한 경우에는, zip 파일명을 생성할 때 뒤에 이 꼬리말을 붙여 주고 '.zip' 확장자를 붙여 줍니다. 여기서 사용자가 입력한 꼬리말에 포함된 공백 문자를 모두 밑줄로 치환하였는데, 이것은 나중에 파일들을 관리할 때 공백 문자가 없는 편이 관리가 더 쉽기 때문입니다.
더 많은 개선점
세 번째 프로그램은 만족스럽게 사용될 수 있겠지만, 언제나 개선할 사항은 넘쳐납니다. 예를 들면, 사용자가 -v 옵션을 통해 출력(verbosity) 단계를 지정하게 하여 프로그램이 실행될 때 단계별로 처리되는 사항을 화면에 출력해 주도록 할 수도 있고, -q 옵션을 통해 아무 출력 없이(quiet) 프로그램이 실행되도록 할 수도 있습니다.
생각해 볼 수 있는 가장 중요한 개선사항은 os.system을 사용하지 않고 파이썬에서 제공되는 내장 모듈인 zipfile이나 tarfile을 이용하여 압축 파일을 생성하는 것입니다. 이들은 표준 라이브러리에 포함되어 있으며 zip 프로그램과 같은 추가 프로그램 등을 설치하지 않고서도 프로그램이 잘 동작하게 해 줍니다.
그러나 여기서는 순전히 교육적인 목적에서 os.system을 이용하여 백업 파일을 생성하였으며, 이를 사용하면 누구나 알아볼 수 있을 만큼 프로그램이 간단해지고 또 이렇게 만든 프로그램을 실제로 사용하기에 당장 무리가 없기 때문에 사용한 것입니다.
자, 이제 os.system을 호출하지 않고 zipfile 모듈을 사용하여 네 번째 프로그램을 스스로 만들어 보시지 않겠습니까?
아래 문서를 참조하여 한번 만들어 보시기 바랍니다.
https://docs.python.org/ko/3/library/zipfile.html
zipfile — Work with ZIP archives
Source code: Lib/zipfile.py The ZIP file format is a common archive and compression standard. This module provides tools to create, read, write, append, and list a ZIP file. Any advanced use of thi...
docs.python.org
기회가 되면 zipfile 모듈을 사용한 압축에 대해서 포스팅하도록 하겠습니다.
소프트웨어 개발 단계
지금까지 소프트웨어를 개발하면서 여러 단계들을 거쳐 왔습니다.
이 단계들은 다음과 같이 축약하여 설명할 수 있습니다:
- 1. 무엇을 만들 것인가? (분석 단계)
- 2. 어떻게 만들 것인가? (설계 단계)
- 3. 만들기 (구현 단계)
- 4. 테스트하기 (테스트와 디버깅 단계)
- 5. 실제로 사용하기 (활용 또는 배포 단계)
- 6. 유지 및 보수하기 (개선 단계)
앞으로 프로그램을 작성할 때 지금까지 여러분이 백업 스크립트를 만들면서 거쳐 왔던 과정을 그대로 따라 하기를 추천합니다. 문제를 분석하고 프로그램을 설계하세요. 구현은 가장 단순한 프로그램으로 시작하세요. 테스트하고 디버그 하세요. 한번 사용해 보고 제대로 동작하는지 확인해 보세요. 이제, 원하는 기능을 추가하고, 만들어보고 테스트해 보고 사용해 보는 일련의 과정들을 반복하며 프로그램을 개선해 나가세요.
요약
지금까지 여러분이 직접 파이썬 프로그램/스크립트를 만드는 법과 이러한 프로그램을 만들기 위해 거쳐 와야 했던 여러 가지 단계들에 대해 배워 보았습니다.
이 챕터에서 배운 것들을 통해 이 챕터에서 배웠던 것들을 떠올리면 유용할 것이며, 또 실제 문제를 해결하는 데 파이썬을 사용하는 것에 좀 더 익숙해질 수 있을 것입니다.
감사합니다.
Do it! SQL을 찾아 주셔서 감사합니다. ♥ 댓글이 큰 힘이 됩니다. |
'IT > 파이썬 기초 (Python)' 카테고리의 다른 글
#032 파이썬 기초 - 객체지향 프로그래밍 I (88) | 2023.03.15 |
---|---|
#031 파이썬 기초 - 절차지향(Procedural) vs 객체지향(Object-Oriented) (86) | 2023.03.14 |
#029 파이썬 기초 - 문제 해결 Part 2 (59) | 2023.03.12 |
#028 파이썬 기초 - 문제 해결 Part 1 (24) | 2023.03.10 |
#027 파이썬 기초 - 자료구조 4편 (Python Data Structure Part 4) (74) | 2023.03.09 |
댓글