Python 표준 라이브러리

배추·2025년 11월 30일

🐍 Python

목록 보기
18/19

Python의 표준 라이브러리에 대해 알아봅니다.


  • 파이썬 표준 라이브러리는 파이썬을 설치할 때 자동으로 컴퓨터에 설치된다.

📍datetime.date

  • datetime.date: 연, 월, 일로 날짜를 표현할 때 사용하는 함수.
  • 연, 월, 일로 datetime.date 객체를 만들 수 있다.
    day1 = datetime.date(2021, 12, 14) # 2021-12-14
    day2 = datetime.date(2023, 4, 5)
  • 객체.days
    • day2에서 day1을 빼면 datetime 모듈의 timedelta 객체가 반환된다.
    • 이 객체를 diff 변수에 대입하고 이 diff 변수를 이용하여 두 날짜의 차이를 확인할 수 있다.
    diff = day2 - day1
    diff.days # 477
  • 요일
    • datetime.date 객체의 weekday 함수
      • 0은 월요일을 의미하며 순서대로 1은 화요일, 2는 수요일, …, 6은 일요일이 된다.
      day = datetime.date(2021, 12, 14)
      day.weekday() # 1
    • isoweekday 함수
      - 월요일은 1, 화요일은 2, …, 일요일은 7을 반환.
      ```python
      day = datetime.date(2021, 12, 14)
      day.isoweekday() # 2
      ```

▶︎time

📍time.time

  • time.time(): UTC(universal time coordinated, 협정 세계 표준시)를 사용하여 현재 시간을 실수 형태로 반환하는 함수.
    • 1970년 1월 1일 0시 0분 0초를 기준으로 지난 시간을 초 단위로 반환해 준다.
time.time() # 1684983953.5221913

📍time.localtime

  • time.localtime: time.time()이 반환한 실숫값을 사용해서 연, 월, 일, 시, 분, 초, ... 의 형태로 바꾸어 주는 함수.
  • 입력 인수 없이 사용할 경우 현재 시각을 기준으로 함수가 수행.
time.localtime(time.time())
# time.struct_time(tm_year=2023, tm_mon=5, tm_mday=21, tm_hour=16, tm_min=48, tm_sec=42, tm_wday=1, tm_yday=141, tm_isdst=0)

📍time.asctime

  • time.asctime: time.localtime가 반환된 튜플 형태의 값을 인수로 받아서 날짜와 시간을 알아보기 쉬운 형태로 반환하는 함수.
  • 입력 인수 없이 사용할 경우 현재 시각을 기준으로 함수가 수행.
time.asctime(time.localtime(time.time()))
# 'Fri Apr 28 20:50:20 2023'

📍time.ctime

  • time.ctime(): time.asctime(time.localtime(time.time()))을 간단하게.
  • ctime이 asctime과 다른 점은 항상 현재 시간만을 반환한다.
time.ctime()
# 'Fri Apr 28 20:56:31 2023'

📍time.strftime

  • time.strftime('출력할 형식 포맷 코드', time.localtime(time.time()))
  • 입력 인수 없이 사용할 경우 현재 시각을 기준으로 함수가 수행.
  • strftime 함수는 시간에 관계된 것을 세밀하게 표현하는 여러 가지 포맷 코드를 제공한다.
    • %a: 요일의 줄임말 (Mon)
    • %A: 요일 (Monday)
    • %b: 달의 줄임말 (Jan)
    • %B: 달 (January)
    • %c: 날짜와 시간을 출력 (Thu May 25 10:13:52 2023)
    • %d: 일 day ([01,31])
    • %H: 시간 hour, 24시간 출력 형태 ([00,23])
    • %I: 시간 hour, 12시간 출력 형태 ([01,12])
    • %j: 1년 중 누적 날짜 ([001,366])
    • %m: 달 ([01,12])
    • %M: 분 ([01,59])
    • %p: AM or PM (AM)
    • %S: 초 ([00,59])
    • %U: 1년 중 누적 주, 일요일 시작 ([00,53])
    • %W: 1년 중 누적 주, 월요일 시작 ([00,53])
    • %w: 숫자로 된 요일 ([0(일), 6(토)])
    • %x: 현재 설정된 지역에 기반한 날짜 출력 (05/25/23)
    • %X: 현재 설정된 지역에 기반한 시간 출력 (17:22:21)
    • %Y: 연도 출력 (2023)
    • %Z: 시간대 출력 (대한민국 표준시)
    • %%: 문자 % (%)
    • %y: 세기 부분을 제외한 연도 출력 (01)
time.strftime('%x', time.localtime(time.time()))
# '05/25/23'

time.strftime('%c', time.localtime(time.time()))
# 'Thu May 25 10:13:52 2023'

📍time.sleep

  • time.sleep: 일정한 시간 간격을 두고 루프를 실행할 수 있다.
  • 인수는 실수 형태를 쓸 수 있다. 1이면 1초, 0.5면 0.5초.
  • 주로 루프 안에서 많이 사용.
# 1초 간격으로 0부터 9까지의 숫자를 출력
for i in range(10):
    print(i)
    time.sleep(1)

📍math.gcd, math.lcm

  • gcd: 최대 공약수(gcd, greatest common divisor)
  • lcm: 최소 공배수(lcm, least common multiple)
math.gcd(60, 100, 80) # 20
math.lcm(15, 25) # 75

▶︎random 모듈

  • random: 난수(규칙이 없는 임의의 수)를 발생시키는 모듈.
  • 📍random()
    • 0.0에서 1.0 사이의 실수 중에서 난수 값을 반환
    random.random() # 0.53840103305098674
    • 1에서 10 사이의 정수 중에서 난수 값을 반환
    random.randint(1, 10) # 6
  • 📍choice(리스트, 무작위로 추출할 원소의 개수): 입력으로 받은 리스트에서 무작위로 하나를 선택하여 반환.
    data = [1, 2, 3, 4, 5]
    random.sample(data, len(data)) # [5, 1, 3, 4, 2]

▶︎itertool 모듈

📍itertools.zip_longest

  • itertools.zip_longest(*iterables, fillvalue=None)
  • 같은 개수의 자료형을 묶는 파이썬 내장 함수인 zip 함수와 똑같이 동작.
  • 전달한 반복 가능 객체(*iterables)의 길이가 서로 다르다면 긴 객체의 길이에 맞춰 fillvalue에 설정한 값을 짧은 객체에 채울 수 있다.
students = ['한민서', '황지민', '이영철', '이광수', '김승민']
snacks = ['사탕', '초컬릿', '젤리']

result = zip(students, snacks)
print(list(result)) # [('한민서', '사탕'), ('황지민', '초컬릿'), ('이영철', '젤리')]

result = itertools.zip_longest(students, snacks, fillvalue='새우깡')
print(list(result)) # [('한민서', '사탕'), ('황지민', '초콜릿'), ('이영철', '젤리'), ('이광수', '새우깡'), ('김승민', '새우깡')]

📍itertools.permutations. itertools.combinations

  • itertools.permutations(iterable, r)
    • 반복 가능 객체 중에서 r개를 선택한 순열을 이터레이터(반복 가능한 객체)로 반환하는 함수.
    list(itertools.permutations(['1', '2', '3'], 2))
    # [('1', '2'), ('1', '3'), ('2', '1'), ('2', '3'), ('3', '1'), ('3', '2')]
  • itertools.permutations(iterable, r)
    • 반복 가능 객체 중에서 r개를 선택한 조합을 이터레이터로 반환하는 함수. (조합은 순서에 상관없이)
    list(itertools.combinations(['1', '2', '3'], 2))
    # [('1', '2'), ('1', '3'), ('2', '3')]
  • itertools.combinations_with_replacement()
    • 같은 숫자를 허용하는 중복 조합.
      len(list(itertools.combinations_with_replacement(range(1, 46), 6)))
      # 15890700

📍functools.reduce

  • functools.reduce(function, iterable)
    • 함수(function)를 반복 가능한 객체(iterable)의 요소에 차례대로(왼쪽에서 오른쪽으로) 누적 적용하여 이 객체를 하나의 값으로 줄이는 함수.
data = [1, 2, 3, 4, 5]
result = functools.reduce(lambda x, y: x + y, data)
print(result)  # 15 
# functools.reduce()로 최댓값 구하기
num_list = [3, 2, 8, 1, 6, 7]
max_num = functools.reduce(lambda x, y: x if x > y else y, num_list)
print(max_num)  # 8 출력

▶︎operator 모듈

📍operator.itemgetter

  • 주로 sorted와 같은 함수의 key 매개변수에 적용하여 다양한 기준으로 정렬할 수 있도록 도와준다.

  • 리스트

    from operator import itemgetter
    
    students = [
        ("jane", 22, 'A'),
        ("dave", 32, 'B'),
        ("sally", 17, 'B'),
    ]
    
    result = sorted(students, key=itemgetter(1))
    # [('sally', 17, 'B'), ('jane', 22, 'A'), ('dave', 32, 'B')]
    • itemgetter(1): students의 아이템인 튜플의 두 번째 요소를 기준으로 정렬.
  • 딕셔너리

    from operator import itemgetter
    
    students = [
        {"name": "jane", "age": 22, "grade": 'A'},
        {"name": "dave", "age": 32, "grade": 'B'},
        {"name": "sally", "age": 17, "grade": 'B'},
    ]
    
    result = sorted(students, key=itemgetter('age'))
    # [{'name': 'sally', 'age': 17, 'grade': 'B'}, {'name': 'jane', 'age': 22, 'grade': 'A'}, {'name': 'dave', 'age': 32, 'grade': 'B'}]
    • itemgetter('age')처럼 딕셔너리의 키를 사용해야 한다.

📍operator.attrgetter

  • 리스트의 요소가 튜플이 아닌 클래스의 객체라면 다음처럼 attrgetter()를 적용하여 정렬해야 한다.
from operator import attrgetter

class Student:
    def __init__(self, name, age, grade):
        self.name = name
        self.age = age
        self.grade = grade

students = [
    Student('jane', 22, 'A'),
    Student('dave', 32, 'B'),
    Student('sally', 17, 'B'),
]

result = sorted(students, key=attrgetter('age'))
  • attrgetter('age'): Student 객체의 age 속성으로 정렬하겠다는 의미.

📍shutil

  • 파일을 복사(copy)하거나 이동(move)할 때 사용하는 모듈.
  • shutil.copy
  • shutil.move
shutil.copy("c:/doit/a.txt", "c:/temp/a.txt.bak") #  c:\doit\a.txt를 c:\temp\a.txt.bak이라는 이름으로 복사
shutil.move("c:/doit/a.txt", "c:/temp/a.txt") # 이동

📍glob.glob

-glob(pathname): 디렉터리에 있는 파일들을 리스트로 만들기.

  • *, ? 등 메타 문자를 써서 원하는 파일만 읽어 들일 수도 있다.
  • ?: 1자리 문자열
  • *: 임의의 길이의 문자열
import glob

glob.glob("c:/doit/mark*")
# ['c:/doit\\marks1.py', 'c:/doit\\marks2.py', 'c:/doit\\marks3.py']

▶︎pickle 모듈

  • pickle: 객체의 형태를 그대로 유지하면서 파일에 저장하고 불러올 수 있게 하는 모듈.
  • 어떤 자료형이든 저장하고 불러올 수 있다.

📍pickle.dump

  • pickle.dump: 딕셔너리 객체인 data를 그대로 파일에 저장.
import pickle

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

📍pickle.dump

  • pickle.load: 원래 있던 딕셔너리 객체(data) 상태 그대로 불러온다.
import pickle

f = open("test.txt", 'rb')
data = pickle.load(f)
print(data) # {2:'you need', 1:'python'}

▶︎os 모듈

  • 환경 변수나 디렉터리, 파일 등의 OS 자원을 제어할 수 있게 해 주는 모듈.

📍os.environ

  • 내 시스템의 환경 변숫값을 알고 싶을 때.
  • 환경 변수에 대한 정보를 딕셔너리 형태로 구성된 environ 객체로 반환한다.
os.environ
# environ({'PROGRAMFILES': 'C:\\Program Files', 'APPDATA': … 생략 …})

# 반환받은 객체를 호출하여 사용
os.environ['PATH']
# 'C:\\ProgramData\\Oracle\\Java\\javapath;...생략...'

📍os.chdir

  • 현재 디렉터리의 위치를 변경.
os.chdir("C:\WINDOWS")

📍os.getcwd

  • 현재 자신의 디렉터리 위치를 반환
os.getcwd() # 'C:\WINDOWS'

📍os.system

  • os.system("명령어"): 시스템 명령어 호출.
os.system("dir")

📍os.popen

  • 시스템 명령어를 실행한 결괏값을 읽기 모드 형태의 파일 객체로 반환.
f = os.popen("dir")
print(f.read()) # 객체 읽기

그 외

  • 📍os.mkdir(디렉터리): 디렉터리를 생성.
  • 📍os.rmdir(디렉터리): 디렉터리를 삭제. 단, 디렉터리가 비어 있어야 삭제할 수 있다.
  • 📍os.remove(파일): 파일을 지운다.
  • 📍os.rename(src, dst): src라는 이름의 파일을 dst라는 이름으로 바꾼다.

▶︎threading

  • 컴퓨터에서 동작하고 있는 프로그램을 프로세스(process)라고 한다.
  • 보통 1개의 프로세스는 1가지 일만 하지만, 스레드(thread)를 사용하면 한 프로세스 안에서 2가지 또는 그 이상의 일을 동시에 수행할 수 있다.
  • 📍threading.Thread(): 스레드 생성.
  • 📍start(): 스레드 실행.
  • 📍join(): 해당 스레드가 종료될 때까지 기다리게 한다.
# thread_test.py
import time
import threading

def long_task():
    for i in range(5):
        time.sleep(1)
        print("working:%s\n" % i)

print("Start")

threads = []
for i in range(5):  # long_task를 5회 수행
    t = threading.Thread(target=long_task)  # 스레드 생성
    threads.append(t)

for t in threads:
    t.start() # 스레드 실행

for t in threads:
    t.join()  # join으로 스레드가 종료될때까지 기다린다.

print("End")

▶︎traceback 모듈

  • traceback: 프로그램 실행 중 발생한 오류를 추적하고자 할 때 사용하는 모듈이다.
  • 📍traceback.format_exc(): 오류 추적 결과를 문자열로 반환하는 함수.
import traceback

def a():
    return 1/0

def b():
    a()

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

main()


# 오류가 발생했습니다.
# Traceback (most recent call last):
#   File "c:\doit\traceback_sample.py", line 14, in main
#     b()
#   File "c:\doit\traceback_sample.py", # line 9, in b
#     a()
#   File "c:\doit\traceback_sample.py", line 5, in a
#     return 1/0
# ZeroDivisionError: division by zero

▶︎json

  • 📍json.load(파일_객체): JSON 파일을 읽어 데이터를 딕셔너리 자료형으로 반환.
with open('myinfo.json') as f:
    data = json.load(f)

type(data) # <class 'dict'>
data # {'name': '홍길동', 'birth': '0525', 'age': 30}
  • 📍json.dump(딕셔너리, 파일_객체): 딕셔너리 자료형을 JSON 파일로 생성.
data = {'name': '홍길동', 'birth': '0525', 'age': 30}
with open('myinfo.json', 'w') as f:
    json.dump(data, f)
  • 📍json.dumps(): 파이썬 자료형을 JSON 문자열로.
    • 딕셔너리를 JSON 데이터로 변경하면 ‘홍길동’과 같은 한글 문자열이 코드 형태로 표시된다. 왜냐하면 dump(), dumps() 함수는 기본적으로 데이터를 아스키 형태로 저장하기 때문.
    • ensure_ascii=False 옵션: 한글 문자열이 아스키 형태의 문자열로 변경되는 것을 방지.
    • indent 옵션: 출력되는 JSON 문자열을 보기 좋게 정렬.
    • 리스트나 튜플처럼 다른 자료형도 JSON 문자열로 바꿀 수 있다.
  • 📍json.loads(): JSON 문자열을 딕셔너리로 다시 역변환.
    • 그러나 JSON 문자열을 딕셔너리로 다시 역변환하여 사용하는 데는 전혀 문제가 없다.
d = {"name":"홍길동", "birth":"0525", "age": 30}

json_data = json.dumps(d)
json_data # '{"name": "\\ud64d\\uae38\\ub3d9", "birth": "0525", "age": 30}'

json.loads(json_data)
# {'name': '홍길동', 'birth': '0525', 'age': 30}

# ensure_ascii=False 옵션
json_data = json.dumps(d, ensure_ascii=False)
json_data # '{"name": "홍길동", "birth": "0525", "age": 30}'
json.loads(json_data)
# {'name': '홍길동', 'birth': '0525', 'age': 30}

# indent 옵션
print(json.dumps(d, indent=2, ensure_ascii=False))
# {
#   "name": "홍길동",
#   "birth": "0525",
#   "age": 30
# }

# 리스트나 튜플처럼 다른 자료형도 JSON 문자열로 바꿀 수 있다.
json.dumps([1,2,3]) # '[1, 2, 3]'
json.dumps((4,5,6)) # '[4, 5, 6]'

▶︎webbrowser

  • 파이썬 프로그램에서 시스템 브라우저를 호출할 때 사용하는 모듈.
  • 📍webbrowser.open_new('http://python.org'): 새창으로 열기.
  • 📍webbrowser.open('http://python.org'): 이미 열린 브라우저로 원하는 사이트를 열고 싶다면.

profile
난 🥬

0개의 댓글