TIL - 2023.07.26

배엘리·2023년 7월 27일
0

📝 오늘 공부한 내용

Data Structure

Stack

  • LIFO
  • 기존 list를 활용
  • push와 pop이 O(1)O(1)
  • 동적배열

Queue

  • FIFO
  • Queue를 리스트로 구현할 시 O(N)이 걸린다.→ 다른 방법 필요!
from collections import deque

queue = deque()
print(queue)
queue = deque([10, 5, 12])
print(queue)

# 앞에 넣기
queue.appendleft(1)
print(queue)

# 뒤에 넣기
queue.append(20)
print(queue)

# 이거랑 동일
array = [10, 5, 12]
array.insert(0, 16)
print(array)

# popleft - 앞 삭제
queue = deque([1, 10, 5, 12, 20])
queue.popleft()
print(queue)

# pop - 뒤 삭제
queue = deque([1, 10, 5, 12, 20])
queue.pop()
print(queue)

Linked List

  • Queue 구조 구현
    • 양쪽으로 자유로운 입출력
    • head, tail에 pop, push 가능
  • 중간 참조는 오래 걸리지만 Queue는 그런게 필요 없어서 상관 없음

Priority Queue → Heapq

IO

test.py에 input.txt에 넣어라

python test.py < input.txt

test.py의 결과를 Ouput.txt에 넣어라

python test.py > output.txt

둘다 합치면

python test.py < input.txt > output.txt

파이프라이닝

  • 한 파일에 나온 표준 출력을 다른 입력 파일 프로그램 표준 출력에다 표준 입력을 넣는 것
  • 콘솔 (input) → python1 → python2 → 콘솔(output)
python test1.py | python test2.py <input.txt > output.txt

표준입출력 + 표준 에러

#표준 입출력
sys.stdin  > 콘솔
sys.stdout > 콘솔

# standard error
sys.stdeer > 콘솔
(yeardream) c06@c06ui-iMac lecture11 % python test1.py > output.txt
123
Traceback (most recent call last):
  File "/Users/c06/Desktop/이어드림/yeardream-DS/Python심화/Lecture11/test1.py", line 12, in <module>
    raise NotImplementedError()
NotImplementedError

output.txt에는 아무것도 안 적힌다.

에러만 콘솔에 나타난다

error redirection

이렇게 하면 에러도 저장 할 수 있다.

(yeardream) c06@c06ui-iMac lecture11 % python test
1.py > output.py 2> log.txt
12345

Log.txt 파일

스크린샷 2023-07-26 오후 1.24.53.png

stderr

File Open

  • 파이썬이 해주는 것이 아닌 OS가 해주는 것
fd = open("<파일이름>", "<접근 모드>", encoding = "utf8) # 파일 열기

fd.close()

접근 모드

Untitled

경로 - 절대 경로-

pickle

  • 클래스를 직렬화 할 수 있다.

직렬화

파이썬의 객체를 일련의 바이트들로 변환한 후 나중에 다시 파이썬 객체로 복원하게 할 수 있는데, 이렇게 파이썬 객체를 일련의 바이트들로 변환하는 것을 직렬화(Serialization)라 하고, 다시 바이트들을 파이썬 객체로 메모리 상에 복원하는 것을 역직렬화(Deserialization)이라 한다. 직렬화된 바이트들은 외부 장치에 저장하거나 다른 시스템으로 전송할 수 있으며, 파이썬을 사용하는 다른 시스템은 (OS와 같은 플랫폼 환경에 상관없이) 다시 이를 파이썬 객체로 역직렬화할 수 있다

test.pkl

import pickle

a = [[(i, j) for i in range (10)] for j in range (10)]

with open("test.pk1", "wb") as fd:
    pickle.dump(a, fd) # a를 fd파일에 넣겠다

read.py

import pickle

with open("test.pk1", "rb") as fd:
    obj = pickle.load(fd)

print(obj)

class pickling

(yeardream) pickle/write_in[t.py](http://t.py/)
Traceback (most recent call last):
File "pickle/write_int.py", line 4, in <module>
out = pickle.load(fd)
AttributeError: Can't get attribute 'Complex' on <module '**main**' from 'pickle/write_int.py'>

→ 정의된 대상에 대해서만 피클을 사용할 수 있다

→ Complex() 란 클래스가 정의되지 않은 상태에서 load를 할 수 없다.

CSV

read

import csv

with open("csv/data.csv", "r") as fd:
    reader = csv.reader(fd) # 대부분은 여기서 잘된다

    for entry in reader:
        print(entry)

write

import csv

with open("csv/output.csv", "w") as fd:
    writer = csv.writer(fd)
    writer.writerow((1, 2, 3))
    writer.writerows([
        (0, "나영", "980511"),
        (1, "수지", "951211"),
        (2, "맹구", "060806")
    ])

Json

{
    "ID" : 4,
    "이름" : "조호준",
    "소지물" : [
        "휴대폰", 
        123456,
        3e-4,
        null
    ]
}

Jsonl - 한 줄 형태

{"ID" : 4,"이름" : "조호준","소지물" : ["휴대폰", 123456,3e-4,null]}
{"ID" : 4,"이름" : "조호준","소지물" : ["휴대폰", 123456,3e-4,null]}

json 파일 읽기

import json

with open('JSON/test.json', "r") as fd:
    obj = json.load(fd)

print(obj) # {'ID': 4, '이름': '조호준', '소지물': ['휴대폰', 123456, 0.0003, None]}
print(obj['소지물'][0]) # 휴대폰

파이썬 파일에서 json으로 export 하기

import json

obj = {
    "ID" : 3,
    "소지물" : [
        "휴대폰",
        4e-3,
        12468285,
        None,
        []
    ]
}

with open("output.json", "w") as fd:
    json.dump(obj, fd)

XML

  • 태그를 기반으로 데이터를 저장
  • html
<abc>
    <소지물 test = asdg>
        <asdfwe></asdfwe>
    </소지물>
</abc>

YAML

  • 설정 저장용

설치 pip install pyyaml

test.yaml

nana : "테스트 중 입니다."
id : 4
user:
  hojuncho:
    sid: 12356
    address: 성남시
  sanghyunlee:
    sid: 58690
    address: 서울시
import yaml

with open("yaml/test.yaml", "r") as fd:
    data = yaml.load(fd, Loader=yaml.FullLoader)

print(data)

--------------------------------------------------
{'nana': '테스트 중 입니다.', 'id': 4, 'user': {'hojuncho': {'sid': 12356, 'address': '성남시'}, 'sanghyunlee': {'sid': 58690, 'address': '서울시'}}}

Setting & Exception & Logging

[Setting] Programming Setting

Command Line Argument (명령행 인자)

  • 실행할 때마다 필요한 설정 값
    • 딥러닝 학습 횟수 (Epoch), 학습 계수

설정파일

  • 한번 설정하면 수정을 잘 안하는 설정값

argparser

  • 인자 별 flag 설정
  • 기본값 설정 가능
  • 특정 셋팅값이 이름, 타입, 디폴트값 지정 가능
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-l', '--left', type=int)
args = parser.parse_args()
print(args)

------------------
python argparser.py --left=20 # 값이 l에 담기고 l에 담긴 값을 left로 넘겨준다
Namespace(left=20)
parser = argparse.ArgumentParser()
parser.add_argument('-l', '--left', type=int)
parser.add_argument('-r', '--right', type=int, default=20)

-------------------------------------------------------
(yeardream) c06@c06ui-iMac lecture12 % /opt/homebrew/Caskroom/miniconda/base/envs/ye
ardream/bin/python /Users/c06/Desktop/이어드림/yeardream-DS/Python심화/Lecture12/arg
parser.py
Namespace(left=None, right=20)

(yeardream) c06@c06ui-iMac lecture12 % python argparser.py --left=20 --right=100
Namespace(left=20, right=100)

###############

parser.add_argument('--operation', dest='op', default="sum") # destination 설정 가능

-------------------------------------------------------

(yeardream) c06@c06ui-iMac lecture12 % python argparser.py --left=20 --right=100
Namespace(left=20, right=100, op='sum')

argparser 활용

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-l', '--left', type=int)
parser.add_argument('-r', '--right', type=int, default=20)
parser.add_argument('--operation', dest='op', default="sum", help="연산자")

args = parser.parse_args()
print(args)

if args.op =='sum':
    out = args.left + args.right
elif args.op == 'sub':
    out = args.left - args.right

print(out)

-----------------------------------------
(yeardream) c06@c06ui-iMac lecture12 % python argparser.py -l 10 -r 20 --operation=s
ub
Namespace(left=10, right=20, op='sub')
-10

Exception Handling

예외가 발생할 수 있는 코드 → (특정 예외 발생시 ) 대응코드 → 계속 진행

try:
	<예외발생코드>
except <예외 클래스>:
	<대응 코드>

assert

a = 1
assert a == 1
print("문제 없음")

==================
문제 없음
a = 2
assert a == 1, "뭔가 코드에서 잘못된 것이 있는 듯?"
print("문제 없음")

--------------------------------------
AssertionError: 뭔가 코드에서 잘못된 것이 있는 듯?

Logging

  • 로깅은 어떤 소프트웨어가 실행될 때 발생하는 이벤트를 추적하는 수단
  • 현재 우리의 프로그램이 어떤 상태를 가지고 있는지, 외부출력을 하게 만들어서 개발자등이 눈으로 직접 확인하는 것
import logging
import functions

logging.basicConfig(
    filename='test.log',
    level=logging.INFO
)

logging.debug("디버깅")
logging.info("정보확인")
logging.warning("정보확인")
logging.error("정보확인")
logging.critical("치명적인 에러")

------------
test.log

INFO:root:정보확인
WARNING:root:정보확인
ERROR:root:정보확인
CRITICAL:root:치명적인 에러
WARNING:root:functions에서 호출됨
logger = logging.getLogger("main")

logger.debug("디버깅")
logger.info("정보확인")
logger.warning("정보확인")
logger.error("정보확인")
logger.critical("치명적인 에러")

------------
test.log

INFO:main:정보확인
WARNING:main:정보확인
ERROR:main:정보확인
CRITICAL:main:치명적인 에러
WARNING:root:functions에서 호출됨

functions.py

import logging

logger = logging.getLogger(__name__)
logger.setLevel(logging.WARNING)

logger.debug("디버깅")
logger.info("정보확인")
logger.warning("정보확인")
logger.error("정보확인")
logger.critical("치명적인 에러")

def log_warning():
    logging.warning("functions에서 호출됨")

main.py

import logging

logging.basicConfig(
    filename='test.log',
    level=logging.INFO
)
logging.debug("디버깅")
logging.info("정보확인")
logging.warning("정보확인")
logging.error("정보확인")
logging.critical("치명적인 에러")
1
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

logger.debug("디버깅")
logger.info("정보확인")
logger.warning("정보확인")
logger.error("정보확인")
logger.critical("치명적인 에러")

import functions
functions.log_warning()

regex: 정규표현식

www.regexr.com에서 연습

문자 클래스[ ]

  • 문자 다 찾기
  • [abcd] → ‘a’, ‘b’, ‘c’, ‘d’ 글자 하나하나 다 찾음

구현하지 말고 라이브러리가 있는지 찾아보기!

pythonic하게 짤 수 있는 코드가 많다. 다른 사람들은 어떻게 찾았는지 생각해보기

💚 오늘 느낀 것

🩵 더 배워야 할 것

동적배열

  • 어떻게 push 와 pop은 O(1) 일까??

0개의 댓글