휴가를 사용해서 오늘 강의는 들을 수 없지만, 강사님께서 올려주신 강의자료를 정리하고 깃헙에 올라올 오늘 실습내용을 확인해보는 것으로 오늘의 공백을 채우려 한다.
학습 내용
1. 모듈
2. 패키지
3. 파일 I/O
4. 예외처리
1. 모듈
모듈이란
💡 하나의 모듈은 서로 관련된 코드의 집합이자 하나의 파일을 의미하며, 함수, 클래스, 변수 등을 모듈 내에 정의할 수 있다. 이렇게 만든 모듈은 다른 Python 프로그램에서 가져와 사용할 수 있다.
모듈 장점
- 재사용성 : 한번 작성한 코드를 여러 프로그램에서 재사용할 수 있다.
- 코드 관리 : 큰 프로그램을 작은 모듈로 나누어 관리할 수 있다.
- 네임스페이스 : 모듈마다 독립적인 네임스페이스를 제공하여 변수 이름 충돌을 방지할 수 있다.
2. 패키지
패키지란
💡 관련있는 함수, 클래스, 변수 등을 묶어 만든 모듈을 폴더로 관리하여 구분하는 것이다. 모듈 하나 이상을 가지고 있는 폴더를 ‘패키지’라고 부른다.
PyPI (Python Package Index)
PyPI란
💡 개인 혹은 단체에 의해 개발 및 유지되는 파이썬 외부 라이브러리(파이썬 언어에 포함되어 있지 않은 추가적인 라이브러리)를 호스팅하고 배포하는 공식 저장소이다.
pip
- PyPI에 공유된 패키지를 검색하고 설치하기 위한 명령어이다.
- pip 명령어를 활용하여 특정 패키지 설치, 업그레이드, 제거, 패키지 목록 관리 등을 할 수 있다.
명령어 의미
| pip install 패키지명 | PyPI에서 패키지명으로 검색하여 최신 버전 설치 |
| pip install 패키지명==버전 | 특정 버전의 패키지를 설치 |
| pip list | 설치된 전체 패키지 및 버전 확인 |
| pip list | grep 패키지명 |
| pip install --upgrade 패키지명 | 특정 패키지의 버전 업데이트 |
| pip uninstall 패키지명 | 설치된 특정 패키지 제거 |
- 패키지간 **‘의존성’**으로 인하여 pip install 시 명시한 패키지 외의 다른 패키지가 같이 설치되기도 한다.
requirements.txt
💡 파이썬으로 인공지능 서빙 프로그램을 만들 때, 프로그램의 종속성 관리를 위해 사용하는 파일의 통상적 이름이다. 이 파일에는 프로젝트에서 사용되는 모든 패키지와 버전이 나열되어 있어, 프로젝트를 배포하거나 다른 환경에서 실행할 때 동일한 패키지 환경을 재현할 수 있도록 한다.
- requirements.txt 파일 생성
- 현재 환경에 설치된 모든 패키지와 버전을 담은 requirements.txt 라는 파일을 생성한다.
pip freeze > requirements.txt - requirements.txt 파일을 이용한 라이브러리 설치
- -r 옵션 뒤에 오는 파일 경로를 읽어 해당 파일 내에 명시된 패키지를 설치한다.
pip install -r requirements.txt - requirements.txt 사용 시 주의 사항
- 가상 환경 사용: requirements.txt 파일을 생성하기 전에 가상 환경을 사용하는 것이 좋다. 이는 프로젝트에 필요한 패키지들만 requirements.txt에 포함되게 하여, 불필요한 패키지들이 포함되는 것을 방지한다.
- 패키지 버전 관리: requirements.txt 파일에 포함된 패키지 버전을 고정하면, 환경의 일관성을 유지할 수 있다. 그러나 필요에 따라 버전을 업데이트하는 것도 중요하다.
- 선별적인 설치: 특정 패키지를 무시하거나 선택적으로 설치하고 싶다면, requirements.txt 파일을 편집하여 필요 없는 패키지를 제거하거나 조건부로 설치되도록 설정할 수 있다.
3. 파일 I/O (파일 입출력)
파일 접근
1. 파일 열기: open()
- 인자로 경로를 포함한 파일명과 파일 열기 모드를 알파벳으로 전달하면서 호출하면, 파일 객체를 반환하는 함수이다.
- 첫 번째 매개변수: 파일명 (경로 포함)
- 두 번째 매개변수: 파일 열기 모드 설정
- r: 읽기 모드
- w: 쓰기 모드 (덮어쓰기)
- a: 수정 모드 (파일 끝에 내용 추가하기)
- 파일을 쓰기 모드로 열 때, 파일이 존재하는 경우에는 원래 있던 내용이 모두 지워지고 해당 파일이 존재하지 않으면 새로운 파일이 생성된다.
- 예를 들어, ‘newFile.txt’ 파일을 C:/dev 디렉터리에 생성하고 싶다면 다음과 같이 작성해야 한다.
f = open('C:\\dev\\frog_song.txt', 'w')
2. 파일 닫기: close()
- 열려 있는 파일 객체를 닫아 주는 역할을 한다.
f.close()
- 프로그램을 종료할 때 파이썬 프로그램이 열려 있는 파일의 객체를 자동으로 닫아주므로 생략 가능하다.
- 하지만 close()를 사용해서 열려 있는 파일을 직접 닫아 주는 것이 좋다.
- (쓰기 모드로 열었던 파일을 닫지 않고 다시 사용하려고 하면 오류가 발생하기 때문이다.)
파일 쓰기
1. 파일 쓰기 : write()
- open한 파일 객체에 대해 write() 메소드를 사용하면, 인자로 넘겨준 하나의 문자열을 파일에 작성한다.
f.write('개구리 소년 빰빠바 개구리 소년 빰빠바\n\n네가 울면 무지개 연못에 비가 온단다\n비바람 몰아쳐도 이겨내고\n일곱번 넘어져도 일어나~라\n울지말고 일어나 피리를 불어라\n\n삘릴리 개굴개굴 삘릴리리\n삘릴리 개굴개굴 삘릴리리\n\n무지개 연못에 웃음꽃 핀다.\n')
f.close()
2. 파일 쓰기 : writelines()
- open한 파일 객체에 대해 writelines() 메소드를 사용하면, 인자로 넘겨준 리스트의 요소를 하나하나 파일에 작성한다.
data = ['개구리 소년 빰빠바 개구리 소년 빰빠바\n\n', '네가 울면 무지개 연못에 비가 온단다\n', '비바람 몰아쳐도 이겨내고\n', '일곱번 넘어져도 일어나~라\n', '울지말고 일어나 피리를 불어라\n\n', '삘릴리 개굴개굴 삘릴리리\n', '삘릴리 개굴개굴 삘릴리리\n\n', '무지개 연못에 웃음꽃 핀다.\n']
f.writelines(data)
파일 읽기
1. 파일 전체 읽기: read()
- 파일 전체 내용을 읽어와 하나의 문자열로 반환한다.
f = open('C:\\dev\\frog_song.txt', 'r')
data = f.read()
print(data)
f.close()
2. 파일에서 한 줄만 읽기: readline()
- 파일에서 한 줄만 읽어와 하나의 문자열로 반환한다.
f = open('C:\\dev\\frog_song.txt', 'r')
line = f.readline()
print(line)
f.close()
- 반복문과 함께 사용하여 전체 파일 내용을 읽어올 수도 있다.
f = open('C:\\dev\\frog_song.txt', 'r')
while True:
line = f.readline()
if not line:
break
print(line)
f.close()
3. 파일 전체를 줄마다 읽기: readlines()
- 파일의 모든 내용을 읽어 한 줄씩을 요소로 갖는 리스트로 반환한다.
f = open('C:\\dev\\frog_song.txt', 'r')
line = f.readlines()
print(line)
f.close()
- 반복문과 함께 사용하여 전체 파일 내용을 읽어 문자열로 출력할 수 있다.
f = open('C:\\dev\\frog_song.txt', 'r')
lines = f.readlines()
for line in lines:
print(line)
f.close()
4. for문을 이용한 파일 읽기
- 반복문을 사용하면 위 세 가지 메서드를 이용하지 않고도 파일 내용을 읽어 출력할 수 있다.
f = open('C:\\dev\\frog_song.txt', 'r')
for line in f:
print(line)
f.close()
파일 내용 추가하기
1. 파일 내용 추가 모드
- 쓰기 모드('w')로 파일을 열 때, 이미 존재하는 파일을 열면 그 파일의 내용이 모두 사라진다.
- → 따라서 원래 있던 값을 유지하면서 단지 새로운 값만 추가해야 할 경우에는 파일을 추가 모드('a')로 열어야 한다.
f1 = open('C:\\dev\\frog_song.txt', 'a')
f1.write("노래끝")
f1.close()
f2 = open('C:\\dev\\frog_song.txt', 'r')
data = f2.read()
print(data)
with 키워드
1. with-open 구문
- 파일을 열면(open), 항상 닫아(close)주어야 한다. with 문은 파일을 열어서 사용하고 사용이 종료되면 파일을 닫는 역할을 한다.
with open("newFile2.txt", "w") as f:
f.write("Life is too short, you need python")
4. 예외 처리
예외(Exception)란
💡 예외(Exception)는 문장이나 표현식이 문법적으로 올바르다 할지라도 프로그램이 실행되는 동안 발생하는 예상치 못한 오류이다. 예를 들어, 사용자가 입력한 값을 숫자로 변환하려고 했는데 그 값이 문자일 경우, 프로그램이 정상적으로 실행되지 못하고 오류가 발생한다.
이처럼 예외는 프로그램이 계획대로 동작하지 않게 만드는 상황을 말하며, 이러한 예외를 적절하게 처리하지 않으면 프로그램이 갑자기 중단될 수 있다. 따라서 프로그램 코드 작성 시 이런 오류 상황을 예측하고, 프로그램이 안전하게 계속 실행될 수 있도록 예외 처리를 해줘야 한다.
예외 발생
- 특수한 경우에만 예외를 발생시키고 처리할 목적으로 예외를 만들어서 사용하기도 한다.
- python 내장 클래스인 Exception 클래스를 상속하여 만들 수 있다.
class MyError(Exception):
(에러 객체 내용)
- 예시
class MyError(Exception):
pass
def say_nick(nick):
if nick == '돼지':
raise MyError()
print(nick)
try:
say_nick("곰")
say_nick("돼지")
except MyError:
print("허용되지 않는 별명입니다.")
예외 처리 기본 문법
💡 예외 처리는 기본적으로 try-except 구조로 작성한다. try 블럭 안에는 실행할 코드를, except 블럭 안에는 try 블럭 안에서 실행하는 코드에서 예외 발생 시 동작할 코드를 작성하면 된다.
1. 모든 예외 상황에 대한 처리
- 예외 처리 코드 작성 방법
try:
(실행할 코드)
except:
(모든 예외 발생 시 동작할 코드)
- 예시
try:
4 / 0
except:
print("예외 발생")
# 실행 결과: 예외 발생
2. 특수 예외 상황에 대한 처리
- 예외 처리 코드 작성 방법
try:
(실행할 코드)
except 오류1:
(오류1 발생 시 동작할 코드)
- 예시
try:
a = [1,2]
print(a[3])
4/0
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
except IndexError:
print("인덱싱 할 수 없습니다.")
# 실행 결과: 인덱싱 할 수 없습니다.
3. 특수 예외 상황에 대한 오류 변수를 사용한 처리
- 예외 처리 코드 작성 방법
try:
(실행할 코드)
except 오류2 as 오류변수2:
(오류2 발생 시 동작할 코드)
(블럭 내부에서 오류2에 대한 내용을 오류변수2로 참조하여 사용 가능)
- 예시
try:
4 / 0
except ZeroDivisionError as e:
print(e)
# 실행 결과: division by zero
예외 처리 추가 문법
1. finally
- finally은 try블럭 뒤에 붙여 사용할 수 있다.
- finally 블럭 내부의 코드는 예외 발생 여부와 상관 없이 항상 수행된다.
try:
f = open('foo.txt', 'z')
# 동작할 코드 내용 작성
finally:
f.close() # try 블럭 수행 중간에 오류가 발생하더라도 마지막에 무조건 실행된다.
2. else
- try문에는 else 절을 사용할 수도 있다.
- try문 수행 중 오류가 발생하면 except절, 오류가 발생하지 않으면 else절이 수행된다.
try:
(동작할 코드)
except [발생오류 [as 오류변수]]:
(오류발생 시 동작할 코드)
else:
(오류가 발생하지 않으면 동작할 코드)
- 예시
try:
age=int(input('나이를 입력하세요: '))
except:
print('입력이 정확하지 않습니다.')
else:
if age <= 18:
print('미성년자는 출입금지입니다.')
else:
print('환영합니다.')
[참고] pass
- 코드를 작성하다 보면 특정 오류가 발생할 경우 그냥 통과시켜야 할 때가 있다. (오류 회피)
- try문 안에서 Error가 발생할 경우, pass를 사용하여 오류를 그냥 회피하도록 작성할 수 있다.
try:
f = open("없는파일", 'r')
except FileNotFoundError:
pass
- pass는 if 문에서도 조건에 해당할 때 실행할 내용이 없으면 쓸 수 있다.
'SK Networks AI > 일일 회고록' 카테고리의 다른 글
| [SK네트웍스 Family AI 캠프 11기] 일일 회고 - 8일차(25.02.18 화요일) (0) | 2025.02.18 |
|---|---|
| [SK네트웍스 Family AI 캠프 11기] 일일 회고 - 7일차(25.02.17 월요일) (0) | 2025.02.17 |
| [SK네트웍스 Family AI 캠프 11기] 일일 회고 - 5일차(25.02.13 목요일) (0) | 2025.02.13 |
| [SK네트웍스 Family AI 캠프 11기] 일일 회고 - 4일차(25.02.12 수요일) (0) | 2025.02.12 |
| [SK네트웍스 Family AI 캠프 11기] 일일 회고 - 3일차(25.02.11 화요일) (0) | 2025.02.10 |