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 표준 라이브러리

75. 파이썬 shutil, glob, pickle 표준 라이브러리

75. 파이썬 shutil, glob, pickle 표준 라이브러리

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

파이썬 표준 라이브러리

shutil

shutil.copy 파일 백업

shutil 라이브러리는 파일을 복사하거나 이동 할 때 사용하는 모듈입니다.
우리가 작업 중인 파일이 있는데 이 파일을 자동으로 백업하는 기능을 파이썬 프로그램으로 코딩한다고 했을 때 d:\test\aaa.txt 파일을 d:\temp\aaa.txt.bak 라고 복사한다고 해봤을 때 shutil 모듈을 사용해 해결 할 수 있습니다.
단, d:\temp 디렉터리는 이미 만들어져 있고, d:\test\aaa.txt 파일은 만드는 중이라는 조건입니다.
아래 코드는 shutil 모듈을 사용해 aaa.txt 파일을 백업하는 코드 입니다.

Python
#  shutil_copy.py
import shutil

shutil.copy("d:/test/aaa.txt", "d:/temp/aaa.txt.bak")

shutil.move 휴지통으로 삭제

만약에 d:\test\aaa.txt 파일을 복사 방식으로 백업 하는게 아닌 d:\temp\aaa.txt 로 이동을 하게 되면 아래와 같이 shutil.move 코드를 사용하면 됩니다.

Python
#  shutil_move.py
import shutil

shutil.move("d:/test/aaa.txt", "d:/temp/aaa.txt")

glob

프로그래밍을 하다가 보면 파일을 읽고 쓰는 기능이 있는 프로그램을 만들 때도 있습니다.
그 중에서 특정한 디렉터리에 있는 파일들의 이름을 전부 확인하고자 할 때 사용하는 모듈이 바로 glob 입니다.

glob(pathname) 디렉터리에 있는 파일들 리스트 만들기

일단 기본적으로 glob 모듈은 디렉터리 안에 있는 파일들을 읽어서 리턴을 해줍니다.
* 이나 ? 등의 메타 문자를 써서 원하는 파일들만 읽어서 리턴을 할 수도 있습니다.
아래 코드는 d:/test 디렉터리에 있는 파일들 중에서 이름이 mark 로 시작하는 파일들을 모두 찾아서 읽어들이는 코드 입니다.

Python
>>> import glob
>>> glob.glob("d:/test/mark*")
['d:/test\\mark1.py', 'd:/test\\mark2.py', 'd:/test\\mark3.py']
>>>

pickle

pickle 모듈은 객체의 형태를 원형대로 유지하면서 파일에 저장하고 저장한 파일을 불러올 수 있도록 해 주는 모듈입니다.

pickle.dump

아래 코드는 pickle 모듈의 dump 함수를 사용해서 딕셔너리 객체인 data 를 원형 그대로 파일에 저장하게 해주는 코드입니다.

Python
>>> import pickle
>>> f = open("test.txt", 'wb')
>>> data = {1: 'python', 2: 'we need'}
>>> pickle.dump(data, f)
>>> f.close()
>>>

pickle.load

아래 코드는 위에서 pickle.dump 로 저장했던 파일을 pickle.load 함수를 사용해서 원래 있던 딕셔너리 객체(data) 상태 그대로 불러와 보는 코드입니다.

Python
>>> import pickle
>>> f = open("test.txt", 'rb')
>>> data = pickle.load(f)
>>> print(data)
{1: 'python', 2: 'we need'}
>>>

결과 처럼 원형 그대로 가지고 온 걸 확인 할 수 있습니다.
방금 예제는 딕셔너리 객체만을 사용했지만 다른 어떤 자료형이든 저장하고 다시 불러올 수가 있습니다.

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