AI 모델 종류와 사용 전략: 2025년 트렌드

AI 모델 종류와 사용 전략: 2025년 트렌드

AI비교분석

AI 기술은 빠르게 발전하고 있지만, 정작 어떤 AI를 선택해야 할지 혼란스러운 경우가 많습니다. 성능, 비용, 활용 분야가 제각각이기 때문에 단순히 하나의 기준만으로 평가하기 어렵죠. 그렇다면 2025년 현재, 주요 AI 모델들은 어떤 차이를 보이고 있을까요?

AI 비교가 필요한 이유

AI는 자연어 처리, 이미지 생성, 데이터 분석 등 매우 다양한 분야에서 활용되고 있습니다. 하지만 AI마다 강점과 한계가 다르기 때문에 기업이나 개인이 활용할 때는 신중한 비교가 필요합니다. 예를 들어 텍스트 생성에는 대규모 언어모델(LLM)이 강점을 가지지만, 이미지 생성에는 별도의 비전 모델이 더 적합합니다. 즉, ‘내가 활용하려는 목적에 맞는 AI를 선택하는 것’이 가장 중요합니다.

대표 AI 모델의 주요 특징

현재 가장 많이 활용되는 AI는 크게 언어 모델, 비전 모델, 멀티모달 모델로 나눌 수 있습니다.

  • 언어 모델(LLM): 글쓰기, 코드 작성, 지식 검색 등 텍스트 기반 작업에 특화
  • 비전 모델: 이미지 생성·편집, 객체 인식, 디자인 보조에 활용
  • 멀티모달 모델: 텍스트와 이미지를 동시에 이해하거나 생성

예를 들어, ChatGPT 계열 모델은 대화와 글쓰기에서 뛰어나고, Midjourney나 Stable Diffusion은 이미지 창작의 강자로 평가됩니다. 최근에는 OpenAI, Google, Anthropic 등이 멀티모달 모델을 앞다투어 발표하며 시장 경쟁을 강화하고 있습니다.

AI 비교 시 고려해야 할 요소

AI를 비교할 때는 단순히 ‘성능이 좋다’는 말만으로 판단하기 어렵습니다. 체크해야 할 주요 요소는 다음과 같습니다.

  • 성능 지표: 정확도, 반응 속도, 맥락 이해 능력
  • 비용: API 사용료 또는 구독료 수준
  • 데이터 보안: 기업 내부 데이터와 연동할 때의 안정성
  • 확장성: 기존 시스템과 얼마나 쉽게 통합할 수 있는지
  • 전문 분야 최적화: 일반 언어 모델이 아닌 특정 산업용 AI인지 여부

이러한 요소들을 종합적으로 따져야만 실제 비즈니스 운영이나 개인 프로젝트에서 최적의 성과를 얻을 수 있습니다.

2025년 AI 경쟁 구도

2025년 9월 현재, AI 시장은 몇 가지 뚜렷한 흐름을 보입니다.

  1. 멀티모달 AI의 확산: 텍스트·음성·이미지를 동시에 다루는 모델이 표준으로 자리 잡고 있습니다.
  2. 개인화 AI의 부상: 사용자의 취향이나 업무 맥락을 반영해 맞춤형 서비스를 제공하는 AI가 강화되고 있습니다.
  3. 비용 효율성 경쟁: 성능 못지않게 저비용·고효율이 중요한 차별화 요소가 되고 있습니다.
  4. 산업 특화형 AI의 성장: 의료, 금융, 제조 등 특정 분야에 최적화된 AI가 빠르게 도입되고 있습니다.

앞으로의 AI 선택 전략

앞으로 AI는 단순히 “최신 모델 사용”이 아니라 “목적 중심형 선택”이 핵심이 될 것입니다. 예를 들어, 콘텐츠 제작자는 창의성을 강화하는 AI를, 기업 분석팀은 정확성과 데이터 보안을 보장하는 AI를 선택해야 합니다.

AI는 이제 선택의 시대에 들어섰습니다. 무조건 성능이 뛰어난 모델보다는 나의 목표와 맞는 AI를 찾는 것이 2025년 AI 활용의 성공 포인트가 될 것입니다.

대표 AI 모델별 장단점 비교

아래 표는 2025년을 기준으로 많이 활용되는 주요 AI 모델들의 장단점을 정리한 것입니다.

AI 모델장점단점

ChatGPT 계열 (OpenAI)자연스러운 대화, 높은 텍스트 생성 능력, 다양한 플러그인과 생태계 지원실시간 정보 제한, 구독료 부담, 특정 특화 작업에는 한계 존재

Claude (Anthropic)긴 맥락 처리 강점, 안전성·윤리성 중심 설계, 기업 친화적인 API 정책한국어 지원 다소 제한적, 일부 창의적 작업에서는 약점

Gemini (Google)최신 검색 기반 답변, 멀티모달 기능 뛰어남, 구글 생태계와 강력한 연동개인정보 이슈 우려, 일부 지역에서 제한적 활용

Llama 계열 (Meta)오픈소스 기반으로 자유로운 커스터마이징 가능, 비용 효율성 우수초기 설정과 운영이 까다로울 수 있음, 기술 지원 부족

Midjourney고품질 예술적 이미지 생성, 커뮤니티 중심으로 빠른 발전세부 조정이 어려움, 상업적 활용 시 저작권 이슈 가능

Stable Diffusion오픈소스 이미지 생성 모델, 세밀한 커스터마이징 가능, 비용 절감 효과기술적 이해 필요, 기본 출력 품질은 추가 튜닝이 필요함

Gemini Vision/Multimodal텍스트+이미지+영상까지 지원, 연구와 실무 모두 활용 가능고성능이지만 비용 부담 큼, 일부 기능은 아직 베타 단계

AI를 활용하는 방법

  • 개인 창작자: Midjourney나 ChatGPT 중심으로 활용
  • 기업 분석/데이터 팀: Claude, Llama 계열 모델 추천
  • 산업 특화 AI 필요 기업: Gemini 멀티모달과 같은 통합형 모델 활용

84. 파이썬 sympy 외부 라이브러리

84. 파이썬 sympy 외부 라이브러리

지난 포스팅에서는 파이썬 외부 라이브러리 Faker 를 통해 테스트 데이터를 대량으로 만들어 보는 방법에 대해 알아 보았습니다.
이번 포스팅에서는 sympy 파이썬 외부 라이브러리에 대해 공부해 보도록 하겠습니다.

파이썬 외부 라이브러리

sympy

sympy 는 방정식 기호 symbol 을 사용하게 해주는 외부 라이브러리입니다.
이전 포스팅에서와 마찬가지로 pip install 을 사용해 설치가 가능합니다.

Python
(py_study_31010) D:\Dropbox.My_Job.Study.Python
(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>pip install sympy
Collecting sympy
  Downloading sympy-1.11.1-py3-none-any.whl (6.5 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.5/6.5 MB 45.8 MB/s eta 0:00:00
Collecting mpmath>=0.19
  Downloading mpmath-1.3.0-py3-none-any.whl (536 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 536.2/536.2 kB 32.9 MB/s eta 0:00:00
Installing collected packages: mpmath, sympy
Successfully installed mpmath-1.3.0 sympy-1.11.1
.study_python_3.11.0.TEST>pip install sympy
Collecting sympy Downloading sympy-1.11.1-py3-none-any.whl (6.5 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.5/6.5 MB 45.8 MB/s eta 0:00:00 Collecting mpmath>=0.19 Downloading mpmath-1.3.0-py3-none-any.whl (536 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 536.2/536.2 kB 32.9 MB/s eta 0:00:00 Installing collected packages: mpmath, sympy Successfully installed mpmath-1.3.0 sympy-1.11.1

이전에 설명 드렸듯이 sympy 패키지를 설치하면서 함께 mpmath 패키지가 설치되는 걸 확인 할 수 있습니다.

sympy 사용해 보기

또치라는 어린이가 가진 돈의 2/5 로 장난감을 샀다고 합니다. 이 때 장난감을 사는 데 쓴 돈이 1,760 원 이라면 남은 돈은 얼마가 될까요?
이 문제는 일차 방정식 문제입니다.
파이썬에서는 sympy 를 사용해서 방정식을 쉽게 풀어 볼 수 있습니다.
fractions 모듈과 sympy 모듈이 함께 필요합니다.

Python
>>> from fractions import Fraction
>>> import sympy
>>> x = sympy.symbols("x")
>>>

또치 어린이가 가진 돈을 x 라고 했을 때 sympy 모듈을 사용하면 위처럼 x = sympy.symbols(“x”) 으로 표현 할 수 있습니다.
sympy.symbols() 는 x 처럼 방정식에 사용하는 미지수를 나타내는 기호를 생성할 때 사용됩니다.

여러 개의 기호 사용하기

만약 두 개의 미지수가 필요하다면 아래와 같이 사용 할 수 있습니다.

Python
x, y = sympy.symbols('x y')

또치가 가진 돈의 2/5 가 1,760 원
이것은 일차 방정식 x * (2/5) = 1760 이 됩니다.
이를 코드로 표현해 보겠습니다.

Python
>>> f = sympy.Eq(x*Fraction('2/5'), 1760)
>>> result = sympy.solve(f)
>>> result
[4400]
>>>

위 코드 에서 처럼 f 라는 방정식을 세웠으므로 sympy.solve(f) 로 x 에 해당되는 값을 구할 수가 있습니다.
결과는 또치라는 어린이는 4,400원을 가지고 있음이 확인이 되었습니다.
여기에서 사용한 돈 1,760 원을 빼면 남은 돈이 됩니다.

Python
>>> remains = result[0] - 1760
>>> remains
2640
>>>

fractions.Fraction
Python
>>> from fractions import Fraction

파이썬에서 유리수 연산을 정확하게 하기 위해서 fractions.Fraction 을 사용을 합니다

유리수의 경우 아래처럼 Fraction(분자, 분모) 형태로 만들 수 있습니다.

Python
>>> a = Fraction(1, 5)
>>> a
Fraction(1, 5)
>>>

Fraction(‘분자/분모’) 의 형태로 문자열로도 만들 수 있습니다.

Python
>>> a = Fraction('1/5')
>>> a
Fraction(1, 5)
>>>

위 내용을 종합 풀이를 해보겠습니다.

Python
# Fraction_test.py
from fractions import Fraction
import sympy

# 가지고 있던 돈은 x 입니다.
x = sympy.symbols("x")

# 가지고 있던 돈의 2/5가 1760원이므로 방정식은 x * (2 / 5) = 1760 입니다.
f = sympy.Eq(x*Fraction('2/5'), 1760)

# 방정식을 만족하는 값 result 를 구합니다.
result = sympy.solve(f)

# 남은 돈은 가지고 있던 돈에서 1760 원을 빼면 됩니다
remains = result[0] - 1760

print('남은 돈은 {} 원 입니다.'.format(remains))

결과는 아래와 같습니다.

Python
(py_study_31010) D:\Dropbox.My_Job.Study.Python
(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>python Fraction_test.py
남은 돈은 2640 원 입니다.
.study_python_3.11.0.TEST>python Fraction_test.py
남은 돈은 2640 원 입니다.

sympy 활용

이차방정식의 해 구하기

x2 = 1 과 같은 이차방정식의 해를 구해보도록 하겠습니다.

Python
>>> import sympy
>>> x = sympy.symbols("x")
>>> f = sympy.Eq(x**2, 1)
>>> sympy.solve(f)
[-1, 1]
>>>

연립방정식의 해 구하기

아래의 연립방정식의 해를 구해 보겠습니다.

Python
x + y = 10
x - y = 4

미지수가 2개 이상이라면 결과값이 리스트가 아닌 딕셔너리가 됩니다.

Python
>>> import sympy
>>> x, y = sympy.symbols('x y')
>>> f1 = sympy.Eq(x+y, 10)
>>> f2 = sympy.Eq(x-y, 4)
>>> sympy.solve([f1, f2])
{x: 7, y: 3}
>>>

  • 이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
84. 파이썬 sympy 외부 라이브러리

83. 파이썬 Faker 외부 라이브러리

83. 파이썬 Faker 외부 라이브러리

지난 포스팅에서는 파이썬 표준 라이브러리인 webbrowser 을 통해 시스템 브라우저를 열어보는 방법과 파이썬 외부 라이브러리를 설치하는 pip 에 대해 알아보았습니다.
이번 포스팅에서는 파이썬 외부 라이브러리 Faker 에 대해 공부해 보도록 하겠습니다.

파이썬 외부 라이브러리

Faker

Faker 는 pip 을 사용하는 유용한 외부 라이브러리 중 하나입니다.
Faker 는 가짜 데이터를 생성해서 테스트를 해보고자 할 때 유용하게 사용되는 라이브러리입니다.

앞서 언급한 대로 외부 라이브러리는 pip 를 이용해서 설치해 주면 됩니다.
Faker 를 pip 를 사용해 설치해 보겠습니다.

Python
(py_study_31010) D:\Dropbox.My_Job.Study.Python
(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>pip install Faker
Collecting Faker
  Downloading Faker-18.7.0-py3-none-any.whl (1.7 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.7/1.7 MB 36.1 MB/s eta 0:00:00
Requirement already satisfied: python-dateutil>=2.4 in c:\users\donnr\anaconda3\envs\py_study_31010\lib\site-packages (from Faker) (2.8.2)
Requirement already satisfied: six>=1.5 in c:\users\donnr\anaconda3\envs\py_study_31010\lib\site-packages (from python-dateutil>=2.4->Faker) (1.16.0)
Installing collected packages: Faker
Successfully installed Faker-18.7.0
.study_python_3.11.0.TEST>pip install Faker
Collecting Faker Downloading Faker-18.7.0-py3-none-any.whl (1.7 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.7/1.7 MB 36.1 MB/s eta 0:00:00 Requirement already satisfied: python-dateutil>=2.4 in c:\users\donnr\anaconda3\envs\py_study_31010\lib\site-packages (from Faker) (2.8.2) Requirement already satisfied: six>=1.5 in c:\users\donnr\anaconda3\envs\py_study_31010\lib\site-packages (from python-dateutil>=2.4->Faker) (1.16.0) Installing collected packages: Faker Successfully installed Faker-18.7.0

Faker 사용해보기

아래처럼 테스트 데이터가 30건 이 필요하다고 하면 Faker 를 이용해 테스트 데이터를 만들어 볼 수 있습니다.

[(이름1, 주소1), (이름2, 주소2), ...(이름30, 주소30)]
fake.name()

아래 코드를 사용해 보겠습니다.

Python
>>> from faker import Faker
>>> fake = Faker()
>>> fake.name()
'Heather Fletcher'
>>>

Heather Fletcher fksms 이름을 쉽게 만들어 봤습니다.
한글 이름을 위해 ko-KR 을 전달해서 fake 객체를 생성해 보겠습니다.

Python
>>> fake = Faker('ko-KR')
>>> fake.name()
'정정희'
>>>

fake.address()

이제 주소도 만들어 보겠습니다.

Python
>>> fake.address()
'울산광역시 은평구 석촌호수50길'
>>>

이제 위의 코드를 바탕으로 이름과 주소를 쌍으로 하는 30 건의 데이터를 만들어 보겠습니다.

Python
>>> test_data = [(fake.name(), fake.address()) for i in range(30)]
>>> test_data
[('배아름', '충청남도 태백시 강남대길'), ('진영희', '대전광역시 동작구 봉은사73길'), ('이경숙', '충청북도 안산시 테헤란12로'), ('김아름', '전라북도 보은군 영동대길'), ('문도윤', '충청남도 고양시 일산동구 테헤란길 (영일신마을)'), ('윤서현', '경기도 원주시 잠실거리 (도현이이마을)'), ('김숙자', '부산광역시 성동구 선릉가'), ('강영희', '강원도 가평군 테헤란904가'), ('박윤서', '서울특별시 관악구 백제고분거리'), ('고재호', '경상남도 성남시 분당구 선릉1로'), ('윤정수', '경상북도 부천시 소사구 잠실길 (채원김김면)'), ('홍예준', '제주특별자치도 과천시 석촌호수27로 (은경이읍)'), ('이하윤', '부산광역시 동 작구 양재천64길 (옥자이읍)'), ('김승민', '경상남도 고양시 일산서구 삼성거리 (숙자김마을)'), ('곽예은', '충청북도 괴산군 도산대76거리 (상철강마을)'), ('오정자', '부산광역시 강서구 석촌호수818가'), ('김영일', '광주광역시 동구 오금거리'), ('김광수', '경상남도 용인시 강남대4로'), ('문민준', '강원도 안양시 동안구 봉은사가 (은경박면)'), ('강성수', '충청북도 수원시 영통구 봉은사거리'), ('고예진', '인천광역시 서대문구 잠실95거리 (선영김리)'), ('최지혜', '광주광역시 서대문구 잠실길 ( 준영권김면)'), ('최성민', '전라남도 인제군 선릉거리 (지은이마을)'), ('류윤서', '강원도 예산군 봉은사로'), ('황현주', '제주특별자치도 논산시 가락길'), ('유동현', '제주특별자치도 파주시 반포대거리 (지우이리)'), ('배지훈', '전라남도 천안시 동 남구 테헤란0로'), ('김민서', '전라남도 오산시 삼성가 (준혁김마을)'), ('구영미', '세종특별자치시 종로구 강남대3가'), ('김예준', '광주광역시 성동구 삼성거리 (건우김리)')]
>>>

기가 막히게 만들어지는 걸 볼 수가 있습니다.

Faker 활용

앞선 코드에서는 name 과 address 만 사용을 했지만 이 외에도 많은 항목들이 있습니다.
대표적인 것들 몇 가지를 알아보겠습니다.

  • fake.name() : 이름
  • fake.address() : 주소
  • fake.postcode() : 우편 번호
  • fake.country() : 국가명
  • fake.company() : 회사명
  • fake.job() : 직업명
  • fake.phone_number() : 휴대폰 번호
  • fake.email() : 이메일 주소
  • fake.user_name() : 사용자명
  • fake.pyint(min_value=0,max_value=100) : 0 부터 100 사이의 임의의 숫자
  • fake.ipv4_private() : IP 주소
  • fake.text() : 임의의 문장
  • fake.catch_phrase() : 한글 임의의 문장
  • fake.color_name() : 색상명

  • 이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
83. 파이썬 Faker 외부 라이브러리

82. 파이썬 표준 라이브러리 webbrowser 와 외부 라이브러리

82. 파이썬 표준 라이브러리 webbrowser 와 외부 라이브러리

지난 포스팅에서는 파이썬 표준 라이브러리 urllib 을 이용해 스마트뎁 smartdev.kr 의 홈페이지중 하나의 페이지를 오프라인에 저장해 보는 방법을 알아보았습니다.
이번 포스팅에서는 webbrowser 표준 라이브러리 와 외부 라이브러리에 대해 공부 해 보도록 하겠습니다.

파이썬 표준 라이브러리

webbrowser

webbrowser 모듈은 파이썬 프로그램에서 내 컴퓨터 시스템의 시스템 브라우저를 호출해서 사용하고자 할때 사용하는 모듈입니다.
프로그램 개발 중 이전 했던 포스팅을 참고하려고 할때 smart.dev.kr 사이트를 새로운 웹 브라우저로 열려고 한다면 어떻게 프로그래밍을 해야 할까요?

open_new()

파이썬으로 웹페이지를 새 창으로 열기 위해서는 webbrowser 모듈의 open_new() 함수를 사용하면 됩니다.

Python
# webbrowser_test.py
import webbrowser

webbrowser.open_new('https://smartdev.kr')

위 코드를 아래처럼 실행해 보면 순식간에 인터넷 창이 열리면서 smartdev.kr 로 접속하는 것을 보실 수가 있습니다.

Python
(py_study_31010) D:\Dropbox.My_Job.Study.Python
(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>python webbrowser_test.py
.study_python_3.11.0.TEST>python webbrowser_test.py

open()

만약에 이미 열린 브라우저로 원하는 사이트를 열어보고 싶다면 open_new() 대신 open() 을 사용하시면 됩니다.

Python
webbrowser.open('https://smartdev.kr')

파이썬 외부 라이브러리

좀전까지 공부한 대로 파이썬 설치시에 기본으로 설치되는 라이브러리를 파이썬 표준 라이브러리 라고 합니다.
이번에는 외부 라이브러리에 대해 공부해 보도록 하겠습니다.
외부 라이브러리의 경우에는 pip 도구를 이용해서 설칠를 해야지 사용이 가능합니다.

pip

pip 은 파이썬 모듈이나 패키지를 쉽게 설치할 수 있도록 도와주는 도구입니다.
pip 으로 파이썬 프로그램을 설치하면 의존성이 있는 모듈이나 패키지를 함께 설치하기 때문에 매우 편리합니다.
예를 들어 B 라는 파이썬 패키지를 설치하려면 A 라는 패키지가 먼저 설치되어야 한다고 가정했을 때
pip 을 사용하면 B 패키지를 설치할 때 A 패키지도 같이 자동으로 알아서 설치해 줍니다.

pip install

PyPl(Python Package Index) 는 파이썬 소프트웨어가 모인 저장 공간입니다.
PyPl에는 십만건 이상의 파이썬 패키지가 등록이 되어 있습니다.
이 패키지들은 누구든지 그냥 내려받아 사용할 수 있게끔 되어 있습니다.
이 곳 PyPl 에서 직접 내려받아서 패키지를 설치 해도 되지만 pip 을 사용한다면 간단하게 설치를 진행 할 수가 있습니다.

Python
pip install AnyPackage

AnyPackage 는 내려받을 수 있는 특정 패키지를 의미합니다.

pip uninstall

pip install 과는 반대로 설치가 되어 있는 패키지를 삭제하고 싶다면 pip uninstall 명령을 실행 하면 됩니다.

Python
pip uninstall AnyPackage

버전 지정 설치

설치하려고 하는 패키지의 버전을 지정해서 설치를 할 수도 있습니다.
아래는 AnyPackage 의 1.04 버전을 설치를 해보는 명령어입니다.

Python
pip uninstall AnyPackage==1.04

위에서 진행 한대로 버전을 생략을 하고 진행을 한다면 최신 버전을 자동으로 설치하게 됩니다.

최신 버전 업그레이드 –upgrade

패키지를 최신 버전으로 업그레이드 하고 싶다면 –upgrade 옵션을 사용하면 됩니다.

Python
pip install --upgrade AnyPackage

설치된 패키지 확인 list

설치된 패키지 목록을 출력 해주는 옵션은 list 입니다.

Python
(py_study_31010) D:\Dropbox.My_Job.Study.Python
(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>pip list
Package            Version
------------------ ---------
async-generator    1.10
attrs              22.2.0
beautifulsoup4     4.12.2
bs4                0.0.1
certifi            2022.12.7
cffi               1.15.1
charset-normalizer 3.1.0
colorama           0.4.6
et-xmlfile         1.1.0
exceptiongroup     1.1.1
h11                0.14.0
idna               3.4
.... 생략 ....
.study_python_3.11.0.TEST>pip list
Package Version ------------------ --------- async-generator 1.10 attrs 22.2.0 beautifulsoup4 4.12.2 bs4 0.0.1 certifi 2022.12.7 cffi 1.15.1 charset-normalizer 3.1.0 colorama 0.4.6 et-xmlfile 1.1.0 exceptiongroup 1.1.1 h11 0.14.0 idna 3.4 .... 생략 ....

  • 이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
82. 파이썬 webbrowser 표준 라이브러리

81. 파이썬 urllib 표준 라이브러리

81. 파이썬 urllib 표준 라이브러리

지난 포스팅에서 json 파이썬 표준 라이브러리를 통해서 JSON 데이터를 처리하는 방법에 대해 알아 보았습니다.
이번 포스팅에서는 urllib 표준 라이브러리에 대해 공부해 보도록 하겠습니다.

파이썬 표준 라이브러리

urllib

urllib 라이브러리는 URL 을 읽고 분석 할 때 사용되는 모듈입니다.
개발 공부하시는 분들이 많이 알고 싶어하시는 웹 크롤링을 할 때 자주 사용되기도 합니다.
인터넷 브라우저로 스마트뎁(smartdev.kr) 의 특정한 페이지를 읽고 싶다면 아래와 같이 사용하면 됩니다.

https://smartdev.kr/페이지 번호 또는 구분기호 (예 : https://smartdev.kr/80-파이썬-json-표준-라이브러리/)

그럼 위의 웹페이지를 오프라인에서도 읽을 수 있도록 페이지 번호를 입력 받아서 smartdev.kr 의 특정 페이지를 smartdev_페이지 번호 또는 구분기호.html 로 저장하는 함수는 어떻게 만들면 좋을까요?
URL 을 호출을 해서 원하는 리소스를 얻으려면 urllib 모듈을 사용하면 됩니다.

Python
# urllib_test.py
import urllib.request

def get_smartdev(page):
    resource = 'https://smartdev.kr/{}'.format(page)
    with urllib.request.urlopen(resource) as s:
        with open('smartdev_%s.html' % page, 'wb') as f:
            f.write(s.read())
print(get_smartdev('80-파이썬-json-표준-라이브러리'))

위 코드에서 get_smartdev(page) 함수는 스마트뎁(smartdev.kr)의 페이지 번호를 입력 받아서 해당 페이지의 리소스 내용을 파일로 저장을 해주는 함수입니다.
urllib.request.urlopen(resource, context=context)로 s 객체를 생성을 하고 s.read() 함수로 리소스 내용의 전체를 읽어 들여 html 파일로 저장을 할 수 있게 해줍니다.

하지만 위 코드를 실행하게 되면 아래처럼 로그 같은 것들이 쭉 나오면서 마지막에 UnicodeEncodeError 오류가 나오게 됩니다.

Python
(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>python urllib_test.py
Traceback (most recent call last):
  File "D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\test.py", line 10, in <module>
    print(get_smartdev('80-파이썬-json-표준-라이브러리'))
  File "D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\test.py", line 6, in get_smartdev
    with urllib.request.urlopen(resource) as s:
  File "C:\Users\donnr\anaconda3\envs\py_study_31010\lib\urllib\request.py", line 216, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\donnr\anaconda3\envs\py_study_31010\lib\urllib\request.py", line 519, in open
    response = self._open(req, data)
  File "C:\Users\donnr\anaconda3\envs\py_study_31010\lib\urllib\request.py", line 536, in _open
    result = self._call_chain(self.handle_open, protocol, protocol +
  File "C:\Users\donnr\anaconda3\envs\py_study_31010\lib\urllib\request.py", line 496, in _call_chain
    result = func(*args)
  File "C:\Users\donnr\anaconda3\envs\py_study_31010\lib\urllib\request.py", line 1391, in https_open
    return self.do_open(http.client.HTTPSConnection, req,
  File "C:\Users\donnr\anaconda3\envs\py_study_31010\lib\urllib\request.py", line 1348, in do_open
    h.request(req.get_method(), req.selector, req.data, headers,
  File "C:\Users\donnr\anaconda3\envs\py_study_31010\lib\http\client.py", line 1282, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "C:\Users\donnr\anaconda3\envs\py_study_31010\lib\http\client.py", line 1293, in _send_request
    self.putrequest(method, url, **skips)
  File "C:\Users\donnr\anaconda3\envs\py_study_31010\lib\http\client.py", line 1131, in putrequest
    self._output(self._encode_request(request))
  File "C:\Users\donnr\anaconda3\envs\py_study_31010\lib\http\client.py", line 1211, in _encode_request
    return request.encode('ascii')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 8-10: ordinal not in range(128)

위 오류는 문자 인코딩과 관련된 오류입니다. ‘ascii’ 코덱은 기본적으로 ASCII 문자만 처리할 수 있으므로, ASCII 범위를 벗어나는 문자를 인코딩하려고 할 때 발생합니다.
URL 에 한글 또는 특수 문자를 포함하는 경우에 발생합니다.
이를 해결하기 위해서는 URL 을 인코딩해야 합니다

Python
import urllib.parse
import urllib.request

def get_smartdev(page):
    encoded_page = urllib.parse.quote(page)
    resource = 'https://smartdev.kr/{}'.format(encoded_page)
    with urllib.request.urlopen(resource) as s:
        with open('smartdev_{}.html'.format(page), 'wb') as f:
            f.write(s.read())

get_smartdev('80-파이썬-json-표준-라이브러리')

위의 코드 에서 처럼 urllib.parse.quote 함수를 사용하여 페이지 이름을 URL 인코딩하여 encoded_page 변수에 저장합니다. 그런 다음 resource 변수에서 이 인코딩된 페이지 이름을 사용하여 URL을 구성합니다.
이렇게 수정하면 URL 인코딩에 문제를 해결하고 해당 오류가 발생하지 않게 됩니다.

아래 처럼 smartdev_80-파이썬-json-표준-라이브러리.html 파일이 잘 생성된 것을 확인 할 수 있습니다.

81. 파이썬 urllib 표준 라이브러리

  • 이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
81. 파이썬 urllib 표준 라이브러리

80. 파이썬 json 표준 라이브러리

80. 파이썬 json 표준 라이브러리

지난 포스팅에서는 파이썬 표준 라이브러리 중 traceback 모듈을 통해 오류가 난 위치와 원인을 찾아보는 방법을 알아 보았습니다.
이번 포스팅에서는 json 표준 라이브러리에 대해 공부해 보도록 하겠습니다.

파이썬 표준 라이브러리

json

json 은 JSON 데이터를 쉽게 처리하게 해주는 모듈입니다.
아래 개인정보를 JSON 형태의 데이터로 만든 mysecret.json 파일이 있습니다.

[파일명 : mysecret.json]

Python
{
    "name": "Python",
    "birth": "0509",
    "age": 15
}

만일 인터넷으로 이 파일을 얻었다고 가정하면 이 파일을 읽어서 파이썬에서 처리할 수 있도록 딕셔너리 자료형으로 만들려면 어떻게 하면 좋을까요?

json.load()

JSON 파일을 읽어서 딕셔너리로 변환을 하기 위해서는 아래 코드처럼 json 모듈을 사용하면 됩니다.

Python
>>> import json
>>> with open('mysecret.json') as f:
...     data = json.load(f)
...
>>> type(data)
<class 'dict'>
>>> data
{'name': 'Python', 'birth': '0509', 'age': 15}
>>>

위 코드 처럼 JSON 파일을 읽어 들일 때에는 json.load(파일 객체)처럼 사용을 하면 됩니다.
이렇게 load() 함수는 읽은 데이터를 딕셔너리 자료형으로 리턴을 하게 됩니다.

json.dump()

반대로 딕셔너리 자료형을 JSON 파일로 생성을 하고자 할 때에는 아래처럼 json.dump(딕셔너리, 파일 객체) 를 사용을 하면 됩니다.

Python
>>> import json
>>> data = {'name': 'Python', 'birth': '0509', 'age': 15}
>>> with open('mysecret.json', 'w') as f:
...     json.dump(data, f)
...
>>>

json.dumps()

이번에는 파이썬 자료형을 JSON 문자열로 만들어 보겠습니다.

Python
>>> import json
>>> d = {"name": "Python", "birth":"0509", "age": 20}
>>> json_data = json.dumps(d)
>>> json_data
'{"name": "Python", "birth": "0509", "age": 20}'
>>>

json_data 가 이상 없이 잘 출력 되는 것을 볼 수 있습니다
그런데 만약 한글이 들어간다면 어떻게 될까요?
아래 코드를 보겠습니다.

Python
>>> import json
>>> d = {"name": "파이썬", "birth":"0509", "age": 20}
>>> json_data = json.dumps(d)
>>> json_data
'{"name": "\\ud30c\\uc774\\uc36c", "birth": "0509", "age": 20}'
>>>

위 json_data 결과에서 보듯이 한글 문자열이 코드의 형태로 표시가 됩니다.
이유는 dump() 나 dumps() 함수는 기본적으로 데이터를 저장할 때 아스키 형태로 저장을 하는데 한글처럼 유니코드 문자열을 아스키 형태로 저장을 하려다 보니 한글 문자열이 깨진 것처럼 보이는 것입니다.
그래도 json.loads()를 이용해서 JSON 문자열을 딕셔너리로 다시 역변환해서 사용하는 데에는 문제가 되지는 않습니다.
아래 코드처럼요

Python
>>> json.loads(json_data)
{'name': '파이썬', 'birth': '0509', 'age': 20}
>>>

ensure_ascii=False

그래도 만약 한글 문자열이 아스키 형태의 문자열로 변경이 되는게 싫다면 이것도 방법은 있습니다.

Python
>>> d = {"name": "파이썬", "birth":"0509", "age": 20}
>>> json_data = json.dumps(d, ensure_ascii=False)
>>> json_data
'{"name": "파이썬", "birth": "0509", "age": 20}'
>>>

위 코드처럼 ensure_ascii=False 옵션을 사용을 하면 됩니다.
이 옵션의 경우 데이터를 저장을 할 때에 아스크 형태로 변환을 하지 않겠다는 옵션입니다.

indent

‘{“name”: “파이썬”, “birth”: “0509”, “age”: 20}’ 이렇게 출력되는 JSON 문자열을 보기 좋게 정렬을 해주는 indent 옵션도 있습니다.

Python
>>> d = {"name": "파이썬", "birth":"0509", "age": 20}
>>> print(json.dumps(d,indent=2, ensure_ascii=False))
{
  "name": "파이썬",
  "birth": "0509",
  "age": 20
}
>>>

딕셔너리 자료형 외에 리스트나 튜플처럼 다른 자료형도 JSON 문자열로 변경할 수가 있습니다.

Python
>>> json.dumps([1 ,2, 3])
'[1, 2, 3]'
>>> json.dumps((4, 5, 6))
'[4, 5, 6]'
>>>

  • 이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
80. 파이썬 json 표준 라이브러리

79. 파이썬 traceback 표준 라이브러리

79. 파이썬 traceback 표준 라이브러리

지난 포스팅에서 파이썬 표준 라이브러리 중 threading 에 대해서 알아보았습니다.
이번 포스팅에서는 파이썬 표준 라이브러리 중 traceback 에 대해서 공부해 보도록 하겠습니다

파이썬 표준 라이브러리

traceback

traceback 은 우리가 프로그래밍을 하고 실행을 했을때 발생하는 오류를 추적하려 할 때 사용되는 모듈 입니다.
간단하게 아래의 예제 코드를 살펴보겠습니다.

Python
# error_test.py
def a():
    return 1 / 0

def b():
    a()

def main():
    try:
        b()
    except:
        print("오류가 발생했습니다.")

main()

위 코드를 실행시켜 보겠습니다.

Python
(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>python error_test.py
오류가 발생했습니다.

바로 print 문에 의해서 오류가 발생했다는 메시지를 출력 해 줍니다.
main() 함수가 시작 되면서 b() 함수를 호출하는데 b() 함수에서 a() 함수를 호출해서 1 을 0 으로 나누라는 명령에 오류가 발생해서 “오류가 발생했습니다.” 라고 메시지를 출력을 합니다.
실제로 이런 간단한 프로그램인 경우에는 그나마 괜찮을 수도 있지만 복잡한 프로그램이라면 어디에서 오류가 발생했는지 찾기가 힘들어집니다.

그래서 이런 때 이 프로그램에서 어떤 코드에서 오류가 발생했는지 위치와 원인을 정확히 판단할 수 있도록 traceback 모듈을 사용하여 프로그램을 업그레이드 하는 것입니다.
아래 코드 처럼 오류가 발생한 위치에 traceback 모듈을 적용을 해 보겠습니다.

Python
# traceback_test.py
import traceback

def a():
    return 1 / 0

def b():
    a()

def main():
    try:
        b()
    except:
        print("오류가 발생했습니다.")
        print(traceback.format_exc())

main()

이전과 동일한 코드에 print(traceback.format_exe()) 이라는 문장만 추가를 했습니다.
결과는 아래와 같이 나옵니다.

Python
(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>python traceback_test.py
오류가 발생했습니다.
Traceback (most recent call last):
  File "D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\test.py", line 12, in main
    b()
  File "D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\test.py", line 8, in b
    a()
  File "D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\test.py", line 5, in a
    return 1 / 0
ZeroDivisionError: division by zero

traceback 모듈을 통해 오류 추적을 진행하고 main() 함수에서 b() 함수를 호출하고 b() 함수에서 다시 a() 함수를 호출해서 1 / 0 을 실행하려 했기 때문에 0 으로 나눌 수 없다는 ZeroDivisionError 가 발생했다는 것을 로그를 통해 정확하게 확인을 할 수가 있습니다.

  • 이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
79. 파이썬 traceback 표준 라이브러리

78. 파이썬 threading 표준 라이브러리

78. 파이썬 threading 표준 라이브러리

지난 포스팅에서는 파이썬 표준 라이브러리 중 zipfile 과 tempfile 에 대해 알아보았습니다.
이번 포스팅에서는 threading 표준 라이브러리에 대해 공부해 보도록 하겠습니다.

파이썬 표준 라이브러리

threading

스레드 프로그래밍은 초보 수준의 프로그래머에게는 구현하기가 매우 어려운 기술 중 하나 입니다.
일단 눈으로만 살펴 보고 넘어 가는게 좋겠네요

컴퓨터에서 동작하고 있는 프로그램들을 프로세스(process) 라고 합니다.
일반적으로 1 개의 프로세스는 한 가지의 일을 할 수 있지만 스레드(Thread)를 사용하게 되면 한 프로세스 안에서 2 가지 또는 그 이상의 작업도 한 번에 수행을 할 수가 있게 됩니다.

Python
#  time_test.py
import time

def long_job():    # 6초의 시간이 걸리는 함수
    for i in range(6):
        time.sleep(1)    # 1초간 대기
        print("Working:%s\n" % i)

print("시작합니다")

for i in range(6):    # long_job 을 6회 수행합니다.
    long_job()
    
print("끝났습니다.")

Python
(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>python time_test.py
시작합니다
Working:0

Working:1

Working:2

Working:3

Working:4

Working:5

Working:0

Working:1

Working:2

Working:3

Working:4

Working:5

Working:0

Working:1

Working:2

Working:3

Working:4

Working:5

Working:0

Working:1

Working:2

Working:3

Working:4

Working:5

Working:0

Working:1

Working:2

Working:3

Working:4

Working:5

Working:0

Working:1

Working:2

Working:3

Working:4

Working:5

끝났습니다.

위 코드에서 long_job 함수는 실행을 하게 되면 6초의 시간이 걸리는 함수입니다.
이 함수를 총 6번 반복해서 실행하는 프로그램입니다.
6초씩 6번을 반복해서 36초라는 시간이 걸리게 됩니다.
그러나 스레드를 이용하게 되면 6초의 시간이 걸리는 long_job 함수를 동시에 실행할 수가 있습니다.
시간이 많이 단축이 되겠죠?
아래는 스레드를 이용한 코드입니다.

Python
#  thread_test.py
import time
import threading # 스레드를 생성하기 위해서는 threading 모듈이 필요합니다.

def long_job():    # 6초의 시간이 걸리는 함수
    for i in range(6):
        time.sleep(1)    # 1초간 대기
        print("Working:%s\n" % i)

print("시작합니다")

threads = []
for i in range(6):    # long_job 을 6회 수행합니다.
    t = threading.Thread(target=long_job) # 스레드를 생성을 합니다.
    threads.append(t)

for t in threads:
    t.start() # 스레드를 실행 합니다.
    
print("끝났습니다.")

Python
(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>python thread_test.py
시작합니다
끝났습니다.
Working:0

Working:0
Working:0


Working:0

Working:0

Working:0

Working:1

Working:1

Working:1

Working:1

Working:1

Working:1

Working:2
Working:2
Working:2
Working:2


Working:2


Working:2


Working:3

Working:3

Working:3

Working:3

Working:3
Working:3


Working:4
Working:4

Working:4

Working:4

Working:4

Working:4


Working:5

Working:5

Working:5

Working:5

Working:5

Working:5

위 코드 두 개를 모두 실행해 보시면 아시겠지만 36초 정도의 시간이 걸리던 작업이 6초 정도에 빨리 진행이 되는 것을 확인 할 수가 있습니다.
이것은 threading.Thread 를 사용해서 만든 스레드 객체가 동시 작업을 가능하게 해주기 때문입니다.

그러나 ‘시작합니다.’ 와 ‘끝났습니다’가 먼저 출력이 된 후에 스레드의 결과가 출력이 되는 것을 확인 할 수 있습니다.
그리고 정상적인 종료도 아닙니다.
원래의 목적은 ‘시작합니다.’가 먼저 출력이 되고 중간에 스레드의 결과가 출력이 된 후 마지막에 ‘끝났습니다.’ 가 출력이 되는 것입니다.
그래서 아래와 같이 수정을 해보겠습니다.

Python
#  thread_test.py
import time
import threading # 스레드를 생성하기 위해서는 threading 모듈이 필요합니다.

def long_job():    # 6초의 시간이 걸리는 함수
    for i in range(6):
        time.sleep(1)    # 1초간 대기
        print("Working:%s\n" % i)

print("시작합니다")

threads = []
for i in range(6):    # long_job 을 6회 수행합니다.
    t = threading.Thread(target=long_job) # 스레드를 생성을 합니다.
    threads.append(t)

for t in threads:
    t.start() # 스레드를 실행 합니다.
    
for t in threads:
    t.join() # join 으로 스레드가 끝날 때 까지 기다립니다.
    
print("끝났습니다.")

아래 결과 처럼 스레드의 join 함수는 해당하는 스레드가 종료될 때까지 기다리게 해줍니다.
따라서 위 코드처럼 수행을 하게 되면 원하던 결과를 얻을 수가 있습니다.

Python
(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>python test.py
시작합니다
Working:0
Working:0

Working:0
Working:0


Working:0
Working:0



Working:1
Working:1


Working:1
Working:1

Working:1


Working:1

Working:2
Working:2
Working:2

Working:2


Working:2


Working:2

Working:3
Working:3

Working:3

Working:3

Working:3
Working:3



Working:4
Working:4
Working:4

Working:4

Working:4



Working:4

Working:5
Working:5

Working:5
Working:5
Working:5


Working:5



끝났습니다.

  • 이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
78. 파이썬 threading 표준 라이브러리

77. 파이썬 zipfile tempfile 표준 라이브러리

77. 파이썬 zipfile tempfile 표준 라이브러리

지난 시간에는 파이썬 표준 라이브러리 중 os 에 대해서 알아보았습니다.
이번 포스팅에서는 파이썬 표준 라이브러리 중 zipfile 과 tempfile 에 대해 공부 해 보도록 하겠습니다

파이썬 표준 라이브러리

zipfile

zipfile 은 여러 개의 파일 들을 zip 형식으로 합치거나 이를 해제할 때 사용되는 모듈입니다.
아래와 같이 3개의 파이썬 파일이 있다고 해봅시다

Python
a.py
b.py
c.py

이렇게 3개의 파이썬 파일을 하나로 합쳐서 mypython.zip 이라는 파일로 만들고
이 파일들을 원래의 파이썬 파일 3개로 해제 하는 프로그램을 만들어 보겠습니다.

zipfile.ZipFile()

아래는 zipfile.ZipFile() 함수를 사용한 코드입니다.

Python
#  zip_test.py
import zipfile

# 파일 하나로 합치기
with zipfile.ZipFile('mypython.zip', 'w') as myzip:
    myzip.write('a.py')
    myzip.write('b.py')
    myzip.write('c.py')

# 하나로 합친 파일 다시 해제하기
with zipfile.ZipFile('mypython.zip') as myzip:
    myzip.extractall()

위 코드처럼 ZipFile 객체의 write() 함수로 개별 파일들을 추가하고 extreactall() 함수를 사용하면 모든 파일을 해제 할 수가 있습니다.
합쳐져 있는 파일에서 특정 파일만 해제를 하고 싶다면 아래 코드와 같이 extract() 함수를 사용을 하면 됩니다.

Python
with zipfile.ZipFile('mypython.zip') as myzip:
    myzip.extract('a.py')

만약에 파일을 압축해서 묶고 싶은 경우에는 compression, compresslevel 옵션을 사용 할 수도 있습니다.

Python
with zipfile.ZipFile('mypython.zip', 'w', compression=zipfile.Zip_LZMA, compresslevel=9) as myzip:
    (....생략....)

compression 에는 4가지의 종류가 있습니다.

  • ZIP_STORED : 압축하지 않고 파일을 zip 으로만 묶는 작업을 합니다. 속도가 빠릅니다.
  • ZIP_DEFLATED : 일반적인 ZIP 압축으로서 속도가 빠르고 압축률은 낮습니다. 그리고 호환성이 좋습니다.
  • ZIP_BZIP2 : bzip2 압축으로 압축률이 높고 속도가 느립니다.
  • ZIP_LZMA : lzma 압축으로 압축률이 높고 속도가 느립니다.(7zip 프로그램과 동일한 알고리즘으로 알려져 있습니다.)

compressionlevel 은 압축 수준을 의미하는 숫자입니다.
압축 수준은 1 에서 9 까지 사용을 하며
1 이 속도가 가장 빠르고 압축률이 낮으며
9 가 속도는 가장 느리고 압축률은 높습니다.

tempfile

파일을 임시로 만들어서 사용하는 경우에 tempfile 을 유용하게 사용할 수 있습니다.

tempfile.mkstemp()

tempfile.mkstemp() 는 중복되지 않는 임시 파일의 이름을 랜덤 하게 만들어서 리턴을 해줍니다.

Python
>>> import tempfile
>>> filename = tempfile.mkstemp()
>>> filename
(3, 'C:\\Users\\donnr\\AppData\\Local\\Temp\\tmpmbfgnpr5')
>>>

tempfile.TemporaryFile()

tempfile.TemporaryFile() 은 임시 저장 공간으로 사용할 파일 객체를 리턴을 해 줍니다.
이 파일은 기본적으로 바이너리 쓰기 모드(wb) 의 성격을 가지고 있습니다.
f.close() 가 호출이 되면 자동으로 삭제가 됩니다.

Python
>>> import tempfile
>>> f = tempfile.TemporaryFile()
>>> f.close()

  • 이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
77. 파이썬 zipfile tempfile 표준 라이브러리

76. 파이썬 os 표준 라이브러리

76. 파이썬 os 표준 라이브러리

지난 포스팅에서는 shutil, glob, pickle 라이브러리에 대해 알아 보았습니다.
이번 포스팅에서는 파이썬 표준 라이브러리 중 os 에 대해서 공부해 보도록 하겠습니다.

파이썬 표준 라이브러리

os

os 모듈의 경우 환경 변수나 디렉터리, 또는 파일 등의 os 자원을 제어 할 수 있게 해주는 모듈입니다.

환경 변수 – os.environ

내 시스템의 환경 변수 값을 알고자 할때는 os.environ 함수를 사용합니다.
시스템은 저마다 각기 다른 환경 변수 값을 가지고 있는데 os.environ 은 현재 내 시스템의 환경 변수 값을 리턴을 해줍니다.
아래 코드는 그 예제입니다.

Python
>>> import os
>>> os.environ
environ({'ALLUSERSPROFILE': 'C:\\ProgramData', 'APPDATA': 'C:\\Users\\donnr\\AppData\\Roaming', 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', 'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', 'COMPUTERNAME': 'BAEKSH_8700K', 'COMSPEC': 'C:\\Windows\\system32\\cmd.exe', 'CONDA_DEFAULT_ENV': 'py_study_31010', 'CONDA_EXE': 'C:\\Users\\donnr\\anaconda3\\Scripts\\conda.exe', 'CONDA_PREFIX': 'C:\\Users\\donnr\\anaconda3\\envs\\py_study_31010', 'CONDA_PROMPT_MODIFIER': '(py_study_31010) ', 'CONDA_PYTHON_EXE': 'C:\\Users\\donnr\\anaconda3\\python.exe', 'CONDA_SHLVL': '1', 'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData', 'FPS_BROWSER_APP_PROFILE_STRING': 'Internet Explorer', 'FPS_BROWSER_USER_PROFILE_STRING': 'Default', 'HOMEDRIVE': 'C:', 'HOMEPATH': '\\Users\\donnr', 'LOCALAPPDATA': 'C:\\Users\\donnr\\AppData\\Local', 'LOGONSERVER': '\\\\BAEKSH_8700K', 'NUMBER_OF_PROCESSORS': '12', 'ONEDRIVE': 'C:\\Users\\donnr\\OneDrive', 'ONEDRIVECONSUMER': 'C:\\Users\\donnr\\OneDrive', 'OS': 'Windows_NT', 'PATH': 'C:\\Users\\donnr\\anaconda3\\envs\\py_study_31010;C:\\Users\\donnr\\anaconda3\\envs\\py_study_31010\\Library\\mingw-w64\\bin;C:\\Users\\donnr\\anaconda3\\envs\\py_study_31010\\Library\\usr\\bin;C:\\Users\\........생략 .......})
>>>

위 코드처럼 내 컴퓨터의 시스템 정보들이 출력이 됩니다.
os.environ 함수는 현재 시스템의 환경 변수에 대한 정보를 딕셔너리 형태로 구성된 environ 객체를 리턴하게 됩니다.
자세히 살펴보면 여러가지 유용한 정보를 찾아 볼 수가 있습니다.
돌려받은 객체를 아래 코드와 같이 호출하여 사용할 수 도 있습니다.
아래 코드든 제 컴퓨터 시스템의 PATH 환경 변수 내용입니다.

Python
>>> os.environ['PATH']
'C:\\Users\\donnr\\anaconda3\\envs\\py_study_31010;C:\\Users\\donnr\\anaconda3\\envs\\py_study_31010\\Library\\mingw-w64\\bin;C:\\Users\\donnr\\anaconda3\\envs\\py_study_31010\\Library\\usr\\bin;C:\\Users\\donnr\\anaconda3\\envs\\py_study_31010\\Library\\bin;C:\\Users\\donnr\\anaconda3\\envs\\py_study_31010\\Scripts;C:\\Users\\donnr\\anaconda3\\envs\\py_study_31010\\bin;C:\\Users\\donnr\\anaconda3\\condabin;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;....생략....'
>>>

디렉터리 위치 변경 – os.chdir

os.chdir 함수를 사용하게 되면 아래 코드와 같이 현재 디렉터리 위치를 변경을 할 수 있습니다.

Python
>>> os.chdir("C:\WINDOWS")

디렉터리 위치 돌려받기 – os.getcwd

os.getcwd 는 현재 자신의 디렉터리 위치를 리턴하게 됩니다

Python
>>> os.getcwd()
'C:\\WINDOWS'
>>>

좀전에 os.chdir 을 이용해 디렉터리 위치를 변경했기에 현재 디렉터리가 c:\WINDOWS 로 나옵니다.

시스템 명령어 호출 – os.system

os.system 은 시스템 자체의 프로그램이나 기타 명령어를 파이썬에서 호출 할 수 있게 해줍니다.
os.system(“명령어”) 의 형태로 사용 하면 됩니다.
아래 코드는 현재 디렉터리에서 시스템 명령어인 dir 명령을 실행하는 코드입니다.

Python
>>> os.system("dir")
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: 6ACD-4F35

 C:\Windows 디렉터리

2023-04-29  오후 08:07    <DIR>          .
2023-01-27  오후 10:07               880 ampa.ini
... 생략 ....
2022-05-07  오후 02:25    <DIR>          WUModels
              27개 파일          10,747,385 바이트
              83개 디렉터리  78,022,414,336 바이트 남음
0
>>>

실행한 시스템 명령어의 결과 값 돌려받기 – os.popen

os.popen 은 시스템 명령어를 실행한 결과 값을 읽기 모드 형태의 파일 객체로 리턴을 해 줍니다.
읽어 들인 파일 객체의 내용을 보기 위해 print 문을 사용한 코드입니다.

Python
>>> f = os.popen("dir")
>>> print(f.read())
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: 6ACD-4F35

 C:\Windows 디렉터리

2023-04-29  오후 08:07    <DIR>          .
2023-01-27  오후 10:07               880 ampa.ini
... 생략 ....
2022-05-07  오후 02:25    <DIR>          WUModels
              27개 파일          10,747,385 바이트
              83개 디렉터리  78,022,414,336 바이트 남음
>>>

유용한 os 기타 함수

os.mkdir

os.mkdir(디렉터리) 형식으로 사용하며 디렉터리를 생성해 줍니다.

os.rmdir

os.rmdir(디렉터리) 형식으로 사용하며 디렉터리를 삭제합니다. 단 디렉터리가 비어있을 경우에만 삭제가 됩니다.

os.unlink

os.unlink(파일) 형식으로 사용하며 파일을 삭제합니다.

os.rename

os.rename(src, dst) 형식으로 사용하면 src 라는 이름의 파일을 dst 라는 이름으로 바꿔주는 기능을 합니다.

  • 이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
76. 파이썬 os 표준 라이브러리