Python | file, pickle.

🛟 Dive.·2024년 3월 7일
0

파일과 디렉토리.

  • 기본적으로 파일 시스템은 파일과 디렉토리로 구분하는데, 윈도에서는 디렉토리라는 용어 대신 폴더라는 용어를 사용.
  • 디렉토리는 파일을 담는 또 하나의 파일로, 여러 파일을 포함할 수 있는 그릇.
  • 파일은 컴퓨터에서 정보를 저장하는 가장 작은 논리적인 단위이다.
  • 파일은 일반적으로 파일명과 확장자로 식별한다.
  • 탐색기 프로그램에서 파일과 디렉토리는 트리 구조로 표현되는데, 그 이유가 바로 디렉토리와 파일이 서로 포함 관계를 가지기 때문.

파일의 종류.

  • 컴퓨터에서 파일의 종류는 다양하지만, 기본적으로 바이너리 파일과 텍스트 파일, 두 가지로 분류할 수 있다.

바이너리 파일.

  • 컴퓨터만 이해할 수 있는 형태인 이진(법) 형식으로 저장된 파일.
  • 일반적으로 메모장으로 열면 내용이 꺠져 보임(메모장에서 해석 불가)
  • 엑셀 파일, 워드 파일 등

텍스트 파일.

  • 사람도 이해할 수 있는 형태인 문자열 형식으로 저장된 파일.
  • 메모장으로 열면 내용 확인이 가능.
  • 메모장에 저장된 파일, HTML 파일, 파이썬 코드 파일 등

파일 읽기.

  • 파이썬에서는 텍스트 파일을 다루기 위해 open() 함수를 사용.
f = open("파일명", "파일 열기 모드")
f.close()
종류설명
r읽기 모드 : 파일 읽기만 할 때 사용.
w쓰기 모드 : 파일에 내용을 쓸 때 사용.
a추가 모드 : 파일의 마지막에 새로운 내용을 추가할 때 사용.
f = open("dream.txt","r")
contents = f.read()
print(contents)
f.close()

파일 읽기 : with문과 함께 사용.

  • with문과 함께 open() 함수를 사용할 수 있다. with문은 들여쓰기를 사용해 들여쓰기가 있는 코드에서는 open()함수가 유지되고, 들여쓰기가 종료되면 open() 함수도 끝나는 방식.
with open('../Users/chohyunjun/Desktop/data/09. a_new_hope.txt','r') as my_life:
    contents = my_life.read()
    print(type(contents), contents)

파일 읽기 : 한 줄씩 읽어 리스트형으로 반환.

  • 파일 전체의 텍스트를 문자열로 반환하는 read() 함수 대신 readlines() 함수를 사용하여 한 줄씩 내용을 읽어 와 문자열 형태로 저장할 수 있다.
with open('../Users/chohyunjun/Desktop/data/09. a_new_hope.txt','r') as my_life:
    content_list = my_life.readlines()
    print(type(contents))
    print(content_list)

파일읽기 : 실행할 때마다 한 줄씩 읽어 오기.

  • readline() 함수는 실행할 때마다 차례대로 한 줄 씩 읽어오는 함수.
with open('../Users/chohyunjun/Desktop/data/09. a_new_hope.txt','r') as my_file:
    i = 0
    while 1:
        line = my_file.readline()
        if not line:
            break
        print(str(i)+"==="+line.replace("\n",""))
        i = i + 1

파일 읽기 : 파일 안 글자의 통계 정보 출력.

with open('../Users/chohyunjun/Desktop/data/09. a_new_hope.txt', 'r') as my_file:
    contents = my_file.read()
    word_list = contents.split(" ")
    line_list = contents.split("\n")

print("총 글자의 수 : ", len(contents))
print("총 단어의 수 : ", len(word_list))
print("총 줄의 수 : ", len(line_list))

파일 쓰기.

  • 텍스트 파일을 저장하기 위해서는 텍스트 파일을 저장할 때 사용하는 표준을 지정해야 하는데, 이것을 인코딩이라고 한다.
f = open("count_log.txt",'w', encoding = 'utf-8')
for i in range(1, 11):
    data = "%d번째 줄이다.\n" %i
    f.write(data)
f.close()

파일 쓰기 : 디렉토리 만들기.

  • 파이썬으로는 파일만 다루는 것이 아니라, 디렉토리도 함께 다룰 수 있다. os 모듈을 사용하면 디렉토리를 쉽게 만들 수 있다.
import os
os.mkdir('log')

if not os.path.isdir('log'):
	os.mkdir('log')

pickle 모듈.

  • 파이썬은 pickle 모듈을 제공하여 메모리에 로딩된 객체를 영속화할 수 있도록 지원.
  • pickle 모듈 사용.
    • 모듈 호출한 후, 객체를 저장할 수 있는 파일을 열고 저장하고자 하는 객체를 넘기면 된다.

    • 파일을 생성할 때는 w가 아닌 wb로 열어야 하는데, 여기서 b는 바이너리를 뜻하는 약자로, 텍스트 파일이 아닌 바이너리 파일로 저장.

    • dump()함수에서는 저장할 객체, 저장될 파일 객체를 차례대로 인수로 넣으면 해당 객체가 해당 파일에 저장.

      import pickle
      
      f = open("list.pickle","wb")
      test = [1,2,3,4,5]
      pickle.dump(test, f)
      f.close()

세그먼트 LED를 이용한 숫자 표시.

  • 7세그먼트(7 segment)
    • 7개의 LED 획으로 숫자나 문자를 나타내는 표시장치.
    • 전자시계, 게이지, 전자회로의 내부 수치를 보여줌.
    • 각각의 획은 LED로 구성, LED의 일부를 켜고 끄는 것으로 숫자나 문자 표시 가능.
import turtle as t

s7seg_img = ['7s0.gif','7s1.gif','7s2.gif','7s3.gif','7s4.gif','7s5.gif',
'7s6.gif','7s7.gif','7s8.gif','7s9.gif','7s10,gif']

def disp_num(k):
	t.shape(s7seg_img[k])
	t,stamp()

def key_0():
	disp_num(0)

def key_1():
	disp_num(1)

def key_2():
	disp_num(2)

def key_3():
	disp_num(3)

def key_4():
	disp_num(4)

def key_5():
	disp_num(5)

def key_6():
	disp_num(6)

def key_7():
	disp_num(7)

def key_8():
	disp_num(8)

def key_9():
	disp_num(9)

def key_10():
	disp_num(10)

t.setup(400, 400)
s = t.Screen()
t.hideturtle()
t,speed(0)

for i in range(11):
	s.addshape(s7seg_img[i])

disp_num(10)

s.onkey(key_0, "0")
s.onkey(key_1, "1")
s.onkey(key_2, "2")
s.onkey(key_3, "3")
s.onkey(key_4, "4")
s.onkey(key_5, "5")
s.onkey(key_6, "6")
s.onkey(key_7, "7")
s.onkey(key_8, "8")
s.onkey(key_9, "9")
s.onkey(key_10, "r")
s.listen()

알고리즘 설계에 따른 코딩.

import turtle as t

s7seg_base = "7s10.gif"
s7seg_led = ["7s-a.gif", "7s-b.gif", "7s-c.gif", "7s-d.gif", "7s-e.gif",
							"7s-f.gif", "7s-g.gif"]

						# a,b,c,d,e,f,g
s7seg_num = [[1,1,1,1,1,1,0], #0
							[0,1,1,0,0,0,0], #1
							[1,1,0,1,1,0,1], #2
							[1,1,1,1,0,0,1], #3
							[0,1,1,0,0,1,1], #4
							[1,0,1,1,0,1,1], #5
							[1,0,1,1,1,1,1], #6
							[1,1,1,0,0,0,0], #7
							[1,1,1,1,1,1,1], #8
							[1,1,1,1,0,1,1]] #9

def disp_num(k):
	t.shape(s7seg_base)
	t.stamp()
	if k < 10:
		for i in range(7):
			if s7seg_num[k][i] == 1:
				t.shape(s7seg_led[i])
				t.stamp()

def key_0():
	disp_num(0)
def key_1():
	disp_num(1)
def key_2():
	disp_num(2)
def key_3():
	disp_num(3)
def key_4():
	disp_num(4)
def key_5():
	disp_num(5)
def key_6():
	disp_num(6)
def key_7():
	disp_num(7)
def key_8():
	disp_num(8)
def key_9():
	disp_num(9)
def key_10():
	disp_num(10)

t.setup(400, 400)
s = t.Screen()
t.hideturtle()
t.spped(0)

s.addshape(s7seg_base)
for i in range(7):
	s.addshape(s7seg_led[i])

disp_num(10)

s.onkeypress(key_0, "0")
s.onkeypress(key_1, "1")
s.onkeypress(key_2, "2")
s.onkeypress(key_3, "3")
s.onkeypress(key_4, "4")
s.onkeypress(key_5, "5")
s.onkeypress(key_6, "6")
s.onkeypress(key_7, "7")
s.onkeypress(key_8, "8")
s.onkeypress(key_9, "9")
s.onkeyrelease(key_10, "0")
s.onkeyrelease(key_10, "1")
s.onkeyrelease(key_10, "2")
s.onkeyrelease(key_10, "3")
s.onkeyrelease(key_10, "4")
s.onkeyrelease(key_10, "5")
s.onkeyrelease(key_10, "6")
s.onkeyrelease(key_10, "7")
s.onkeyrelease(key_10, "8")
s.onkeyrelease(key_10, "9")
s.listen()

오류의 종류.

  • 오류
    • 구문 오류
      • 프로그램 실행 전에 발생하는 오류.
    • 런타임 오류 / 예외
      • 프로그램 실행 중에 발생하는 오류.

구문 오류.

SyntaxError : EOL while scanning string literal

⇒ SyntaxError

  • 구문에 문제가 있어 프로그램 실행부터 불가능한 경우.

예외 / 런타임 오류.

  • 실행 중에 발생하는 오류.

에외가 발생하는 코드.

print("# 프로그램이 시작되었습니다!")

# 예외 발생 코드.
list_a[1]

예외 해결.

print("# 프로그램이 시작되었습니다!")

#예외 발생 코드 해결.
list_a = [1,2,3,4,5]
list_a[1]

예측 가능한 예외와 예측 불가능한 예외.

  • 예측 가능한 예외 : 발생 여부를 개발자가 사전에 인지할 수 있는 예외.
    • 개발자는 예외를 예측하여 명시적으로 예외가 발생할 때는 어떻게 대응 하라고 할 수 있음. 대표적으로 사용자 입력란에 값이 잘못 들어갔다면, if문을 사용하여 사용자에게 잘못 입력하였다고 응답하는 방법이 있다. 매우 쉽게 대응할 수 있음.
  • 예측 불가능한 예외 : 대표적으로 매우 많은 파일을 처리할 때 문제가 발생할 수 있다. 예측 불가능한 예외가 발생했을 경우, 인터프리터가 자동으로 이것이 예외라고 사용자에게 알려 준다. 대부분은 이러한 예외가 발생하면서 프로그램이 종료되므로 적절한 조치가 필요.

예외 처리.

  • 조건문을 사용하는 방법.
    • 기본 예외 처리.
  • try 구문을 사용하는 방법.

예외의 종류.

예외내용
indexError리스트의 인덱스 범위를 넘어갈 때
NameError존재하지 않는 변수를 호출할 때
ZeroDivisionError0으로 숫자를 나눌 때
ValueError변환할 수 없는 문자나 숫자를 변환할 때
FileNotFoundError존재하지 않는 파일을 호출할 때

예외 상황 확인하기.

예외가 발생할 수 있는 코드.

# 숫자를 입력.
number_input_a = int(input("정수 입력 > "))

# 출력합니다.
print("원의 반지름 :", number_input_a)
print("원의 둘레 : ", 2 * 3.14 * number_input_a)
print("원의 넓이 : ", 3.14 * number_input_a * number_input_a)

조건문으로 예외 처리.

  • 위 슬라이드의 경우.
# 숫자를 입력.
user_input_a = input("정수 입력 > ")

# 사용자 입력이 숫자로만 구성되어 있을 때.
if user_input_a.isdigit():
	# 숫자로 변환.
	number_input_a = int(user_input_a)
	# 출력.
	print("원의 반지름 : ", number_input_a)
	print("원의 둘레 : ", number_input_a)
	print("원의 넓이 : ", number_input_a * number_input_a)
else:
	print("정수를 입력하지 않았습니다."0

try except 구문.

  • 에외 처리할 수 있는 구문.
try:
	예외가 발생할 가능성이 있는 코드.
except:
	예외가 발생했을 때 실행할 코드.
  • try except 구문과 pass 키워드 조합.
  • 예외가 발생하면 일단 처리해야 하지만, 해당 코드가 딱히 중요한 부분이 아닌 경우 프로그램 강제 종료 방지를 위해 except 구문 안을 비워 두고 try 구문 사용.
  • pass 키워드를 빈 except 구문에 넣음.
try:
	예외가 발생할 가능성이 있는 코드.
except:
	pass
  • try except 구문 뒤에 else 구문을 붙여 사용하면 예외가 발생하지 않았을 때 실행할 코드를 지정할 수 있음.
try:
	예외가 발생할 가능성이 있는 코드.
except:
	예외가 발생했을 때 실행할 코드.
else:
	예외가 발생하지 않았을 때 실행할 코드.

⇒ 이 때, 예외 발생 가능성 있는 코드만 try 구문 내부에 넣고 나머지는 모두 else 구문으로 빼는 경우 많음.

finally 구문.

  • 예외 처리 구문에서 가장 마지막에 사용할 수 있는 구문.
  • 에외 발생 여부와 관계없이 무조건 실행할 경우 사용.
try:
	예외가 발생할 가능성이 있는 코드.
except:
	예외가 발생했을 때 실행할 코드.
else:
	예외가 발생하지 않았을 때 실행할 코드.
finally:
	무조건 실행할 코드.

예외처리 사용 구문.

  • try + except 구문 조합.
  • try + except + else 구문 조합.
  • try + except + finally 구문 조합.
  • try + except + else + finally 구문 조합.
  • try + except 구문 조합.

raise문.

  • raise 문은 try-except문과 달리 필요할 때 예외를 발생시키는 코드.
raise 예외 타입(예외 정보)

assert 문.

  • assert 문은 미리 알아야 할 예외 정보가 조건에 만족하지 않을 경우, 예외를 발생시키는 구문.
  • assert 조건, 메세지
assert 예외 조건.

키워드로 정리하는 핵심 포인트.

  • 구문 오류 : 프로그램의 문법적 오류로 프로그램이 실행조차 되지 않게 만드는 오류.
  • 예외(런타임 에러) : 프로그램 실행 중에 발생하는 오류. try catch 구문 등으로 처리할 수 있다. try catch 구문 등으로 처리할 수 있다. 반대로 구문 오류는 실행 자체가 안되므러 try catch 구문으로 처리할 수 없다.
  • 기본 예외 처리 : 조건문 등을 사용해 예외를 처리하는 기본적 방법.
  • try except 구문 : 예외 처리에 특화된 구문.
  • raise 구문
  • assert 구문 처리.
profile
Data Science. DevOps.

0개의 댓글

관련 채용 정보