Untitled_Blue

[Python] 라이브러리 본문

Programming Language/Python

[Python] 라이브러리

Untitled_Blue 2024. 3. 2. 21:36
반응형

안녕하세요. 이번 글은 라이브러리에 대한 설명입니다.

- 라이브러리 (Library)

  • 표준 라이브러리와 외부 라이브러리로 구성되어 있다.
  • 표준 라이브러리는 파이썬 설치 시 기본적으로 같이 제공하는 라이브러리
  • 외부 라이브러리는 표준과 다르게 pip 도구를 사용하여 설치해야 하는 라이브러리
import datetime

a = datetime.date(2024, 2, 12)
b = datetime.date(2024, 1, 1)

print(a - b) # 42 days, 0:00:00
print((a - b).days) # 42

print(datetime.date(2024, 2, 12).weekday()) # 0
print(datetime.date(2024, 2, 12).isoweekday()) # 1
print(datetime.date(2024, 2, 13).today()) # 2024-02-12
print(datetime.date(2024, 2, 12).ctime()) # Mon Feb 12 00:00:00 2024
  • datetime : 날짜를 표현할 때 사용하는 라이브러리
  • datetime.date(year, month, day) : 날짜를 표현하고 활용하기 위한 메서드
  • datetime.date(year, month, day).weekday() : 날짜 내 요일을 숫자로 반환해주는 메서드 (0부터 월요일을 표현함)
  • datetime.date(year, month, day).isoweekday() : 날짜 내 요일을 1부터 월요일을 표현하는 메서드
  • datetime.date(year, month, day).today() : 현재 날짜를 표현하는 메서드
  • datetime.date(year, month, day).ctime() : 날짜를 미국 표기법 기준으로 표현해주는 메서드
import time

print(time.time()) # 1707737968.4038312

print(time.localtime()) # time.struct_time(tm_year=2024, tm_mon=2, tm_mday=12, tm_hour=20, tm_min=39, tm_sec=28, tm_wday=0, tm_yday=43, tm_isdst=0)

print(time.localtime().tm_year) # 2024
print(time.localtime().tm_mon) # 2
print(time.localtime().tm_mday) # 12

print(time.asctime()) # Mon Feb 12 20:40:57 2024
print(time.ctime()) # Mon Feb 12 20:40:57 2024
print(time.strftime('%a %A , %b %B, %c, %d %D', time.localtime(time.time()))) # Mon Monday , Feb February, Mon Feb 12 20:46:56 2024, 12 02/12/24
print(time.strftime('%H, %I', time.localtime(time.time()))) # 20, 08
print(time.strftime('%j, %m, %M, %p', time.localtime(time.time()))) # 043, 02, 46, PM
  • time : 날짜와 시간을 다루는 라이브러리
  • time.time() : 현재 시간을 UTC를 기반으로 1970년 1월 1일을 시작으로 하는 누적되는 초를 반환하는 메서드
  • time.localtime() : 현재 시간을 구조적으로 표현해주는 메서드
  • time.asctime(), time.ctime() : 현재 시간을 미국 시간 표기법으로 반환하는 메서드
  • time.strftime('[format]', time.localtime(time.time())) : 날짜와 시간을 세부적으로 표현 및 활용할 수 있는 메서드
포맷형식 설명
%a, %A 요일의 약어 및 풀네임
%b, %B 월의 약어 및 풀네임
%c 날짜와 시간 출력
%d 1일부터 31일까지의 일자
%H, %I 몇시인지를 출력 (24시간제, 12시간제)
%j 1년 중 누적 날짜 (1월1일을 기준으로 몇일째인지 출력)
%p AM/PM 출력
%m 1월부터 12월까지의 월 숫자 출력
%M 몇 분인지를 숫자로 출력
%S 초 출력
%U 1년 중 누적 주차 (일요일을 시작으로 1월1일을 기준으로 몇주째인지를 출력)
%w 요일을 숫자로 출력 (0부터 일요일 6까지 토요일)
%W 1년 중 누적 주차 (월요일을 시작으로 1월1일을 기준으로 몇주째인지를 출력)
%x, %X 현재 지역 기준으로 날짜, 시간 출력
%Y 연도 출력
%Z 시간대 출력
import time

for i in range(10):
    print(i + 1)
    time.sleep(1)

다음 코드를 실행해보면 JAVA나 C#를 공부해본 사람이라면 쓰레드(Thread)를 생각할 것이다. 그렇다. 해당 부분은 쓰레드에서 봤던 .sleep() 부분을 파이썬에서 time 라이브러리를 통해 구현할 수 있다는 점을 확인할 수 있는 코드이다. 해당 코드를 실행해보면 time.sleep(sec)를 활용해서 설정해둔 초시간을 기반으로 순차적으로 내부 코드가 실행된다는 점을 확인할 수 있다.

import math
import random

print(math.gcd(60, 48)) # 12
print(math.lcm(60, 48)) # 240

print(random.random())
print(random.randint(1, 10))
print(random.choice([1,2,3,4,5]))
print(random.sample([1,2,3,4,5], 3))

상단의 코드는 수학 관련 라이브러리인 math와 랜덤 기능을 구현해주는 random 라이브러리이다.

  • math.gcd(a, b) : 두 수의 최대공약수를 구하는 함수
  • math.lcm(a, b) : 두 수의 최소공배수를 구하는 함수
  • random.random() : 소수로서 랜덤된 숫자 결과를 보여주는 함수
  • random.randint(a, b) : 두 수 사이의 범위에서 숫자 하나를 무작위로 보여주는 함수
  • random.choice([List]) : 리스트 사이에서 무작위로 하나의 값을 보여주는 함수
  • random.sample([List], a) : 리스트 사이에서 정한 갯수만큼 무작위로 보여주는 함수
import itertools

members = ['박초롱', '윤보미', '정은지', '김남주', '오하영']
drinks = ['아메리카노', '자몽허니블랙티', '바닐라라떼']

# [('박초롱', '아메리카노'), ('윤보미', '자몽허니블랙티'), ('정은지', '바닐라라떼')]
result = zip(members, drinks)
print(list(result))

# [('박초롱', '아메리카노'), ('윤보미', '자몽허니블랙티'), ('정은지', '바닐라라떼'), ('김남주', '카페모카'), ('오하영', '카페모카')]
result = itertools.zip_longest(members, drinks, fillvalue='카페모카')
print(list(result))

"""
[('아메리카노', '자몽허니블랙티', '바닐라라떼'), 
('아메리카노', '바닐라라떼', '자몽허니블랙티'), 
('자몽허니블랙티', '아메리카노', '바닐라라떼'), 
('자몽허니블랙티', '바닐라라떼', '아메리카노'), 
('바닐라라떼', '아메리카노', '자몽허니블랙티'), 
('바닐라라떼', '자몽허니블랙티', '아메리카노')]
"""
result = itertools.permutations(drinks, 3)
print(list(result))

"""
[('아메리카노', '자몽허니블랙티'), 
('아메리카노', '바닐라라떼'), 
('자몽허니블랙티', '바닐라라떼')]
"""
result = itertools.combinations(drinks, 2)
print(list(result))

"""
[('아메리카노', '아메리카노'), 
('아메리카노', '자몽허니블랙티'), 
('아메리카노', '바닐라라떼'), 
('자몽허니블랙티', '자몽허니블랙티'), 
('자몽허니블랙티', '바닐라라떼'), 
('바닐라라떼', '바닐라라떼')]
"""
result = itertools.combinations_with_replacement(drinks, 2)
print(list(result))

상단 코드는 itertools 라는 반복 가능한 객체를 중심으로 다루는 라이브러리를 활용한 소스코드이다.

  • itertools.permutations([List], a) : 순열로서 리스트에서 a개를 선택해서 순열을 반복 가능한 객체로 반환하는 함수
  • itertools.combinations([List], a) : 리스트에서 a개를 선택해서 조합을 반복 가능한 객체로 반환하는 함수
  • itertools.combinations_with_replacement([List], a) :  같은 숫자를 중복해서 조합 가능한 함수
import functools

data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

print(functools.reduce(lambda x, y: x * y, data)) # 3628800
print(functools.reduce(lambda x, y: x + y, data)) # 55

상단 코드는 functools라는 라이브러리를 활용했으며 그 안에 있는 functools.reduce([function], [List])는 함수를 반복 가능한 객체에 적용시켜 좌에서 우측으로 적용시켜 하나의 값으로 합치는 역할을 담당하고 있다.

import operator

listing = [('Eunji', '1993'), ('Chorong', '1991'), ('Bomi', '1993'), ('Namjoo', '1995'), ('Hayoung', '1996')]

# [('Chorong', '1991'), ('Eunji', '1993'), ('Bomi', '1993'), ('Namjoo', '1995'), ('Hayoung', '1996')]
print(sorted(listing, key=operator.itemgetter(1)))

listing02 = [{"name": 'Eunji', "Year": '1993', "result": '100'},
             {"name": 'Chorong', "Year": '1991', "result": '75'},
             {"name": 'Bomi', "Year": '1993', "result": '90'},
             {"name": 'Namjoo', "Year": '1995', "result": '80'},
             {"name": 'Hayoung', "Year": '1996', "result": '95'}]

'''
[{'name': 'Bomi', 'Year': '1993', 'result': '90'}, 
{'name': 'Chorong', 'Year': '1991', 'result': '75'}, 
{'name': 'Eunji', 'Year': '1993', 'result': '100'}, 
{'name': 'Hayoung', 'Year': '1996', 'result': '95'}, 
{'name': 'Namjoo', 'Year': '1995', 'result': '80'}]
'''
print(sorted(listing02, key=operator.itemgetter('name')))

'''
[{'name': 'Chorong', 'Year': '1991', 'result': '75'}, 
{'name': 'Eunji', 'Year': '1993', 'result': '100'}, 
{'name': 'Bomi', 'Year': '1993', 'result': '90'}, 
{'name': 'Namjoo', 'Year': '1995', 'result': '80'}, 
{'name': 'Hayoung', 'Year': '1996', 'result': '95'}]
'''
print(sorted(listing02, key=operator.itemgetter('Year')))

'''
[{'name': 'Eunji', 'Year': '1993', 'result': '100'}, 
{'name': 'Chorong', 'Year': '1991', 'result': '75'}, 
{'name': 'Namjoo', 'Year': '1995', 'result': '80'}, 
{'name': 'Bomi', 'Year': '1993', 'result': '90'}, 
{'name': 'Hayoung', 'Year': '1996', 'result': '95'}]
'''
print(sorted(listing02, key=operator.itemgetter('result')))
  • operator.itemgetter() : sorted()와 같은 함수의 key 매개변수에 적용해서 다양한 기준으로 정렬하도록 도와주는 모듈

상단 코드처럼 정렬하고자 하는 대상이 튜플이면 몇 번째를 기준으로 정렬하겠다고 의사를 밝혀야 하기 때문에 .itemgetter()에 숫자를 넣는다. 이 때 숫자는 0부터 첫번째를 시작한다.  만약 정렬 대상이 Key와 Value가 명확한 딕셔너리면 괄호 안에 정렬 기준은 Key가 된다. 그러면 괄호 안에 명시해둔 Key값을 기준으로 정렬된다.

import operator

class Member:
    def __init__(self, name, year):
        self.name = name
        self.year = year

listing = [
    Member('Eunji', '1993'),
    Member('Chorong', '1991'),
    Member('Bomi', '1993'),
    Member('Namjoo', '1995'),
    Member('Hayoung', '1996')
]

# [('Chorong', '1991'), ('Eunji', '1993'), ('Bomi', '1993'), ('Namjoo', '1995'), ('Hayoung', '1996')]
print(sorted(listing, key=operator.attrgetter('year')))

다음과 같이 정렬할 대상이 튜플이면서 클래스가 있는 경우에는 attrgetter()안에는 클래스 안에 있는 매개변수를 통해 정렬 기준을 지정해야 한다.

import shutil

shutil.copy('C:\Practice_\Sample.txt', 'C:\Practice_\Sample.txt.pdf')

shutil 라이브러리는 파일을 이동하거나 복사할 때 사용하며 대표적으로 2개의 함수가 있다.

  • .copy('[대상파일]', '[복사될 파일의 위치와 이름]') : 대상 파일을 원하는 위치에 원하는 이름과 확장자로 복사
import shutil

shutil.move('C:\Practice_\Sample.txt.pdf', 'C:\Practice_Legacy_\Sample.txt.pdf')

  • .move('[이동할 파일 위치와 파일명]', '[이동될 파일 위치와 파일명]') : 대상 파일을 원하는 위치에 이동
import glob

print(glob.glob('C:/*'))

'''
[
'C:/apache-tomcat-8.5.93', 
'C:/Practice_', 'C:/Practice_Legacy_', 
'C:/Program Files', 'C:/Program Files (x86)', 
'C:/ProgramData', 'C:/Recovery', 
'C:/Temp', 'C:/Users'
...
]
'''
  • glob.glob('[경로]') : 디렉토리에 있는 폴더와 파일을 리스트 형식으로 출력하는 역할
import webbrowser

webbrowser.open_new('https://untitedblue.tistory.com/')
  • webbrowser.open_new('[URL]') : 웹브라우저를 통해 웹사이트에 접속해주는 역할
import zipfile

with zipfile.ZipFile('C:/Practice_/Sample_ziping_20240302.zip', 'w') as ziping :
    ziping.write('C:/Practice_/Sample.txt')
    ziping.write('C:/Practice_/Sample_002.txt')
    ziping.write('C:/Practice_/Sample_003.txt')

with zipfile.ZipFile('C:/Practice_/Sample_ziping_20240302.zip') as ziping :
    ziping.extractall()

상단의 코드는 zipfile이라는 라이브러리인데 이는 주로 여러 파일을 압축하거나 해제할 때 사용한다.

  • with zipfile.ZipFile([FilePath], [옵션]) as [Alias] : 압축파일을 저장할 위치와 옵션을 지정
  • [Alias].write([FilePath + FileName]) 압축할 파일 지정
  • [Alias].extractall() : 전체 압축 해제
  • [Alias].extract([FileName]) : 특정파일 압축 해제
import json

with open('C:/Practice_/student.json') as j :
    result = json.load(j)

print(type(result)) # <class 'dict'>
print(result) # {'name': '홍길동', 'age': 25, 'major': '컴퓨터공학과'}

plusData = {"name": "이순신", "age": 23, "major": "기계공학과"}
result = json.dumps(plusData, ensure_ascii=False) 

print(result) # {"name": "이순신", "age": 23, "major": "기계공학과"}

상단 코드는 json이라는 라이브러리이며 json 파일을 읽고 쓰는데 사용한다.

  • with open([FilePath + FileName]) as [Alias] : 명칭을 지정하면서 특정 파일을 사용하기 위해 오픈
  • json.load([Alias]) : 오픈한 파일에 대한 데이터가 있는 명칭을 읽어오는 역할
  • json.dumps([dict], ensure_ascii=False) : 딕셔너리 형태의 객체를 json으로 변환하는 역할이며 ensure_ascii=False를 통해 유니코드로 출력되는 것을 일반적인 문자로 출력되도록 한다.
반응형