[DAY 5] File Handling
File system, 파일 시스템
- File system, 파일 시스템
- OS에서 파일을 저장하는 트리구조 저장 체계
- File
- 컴퓨터 등의 기기에서 의미 있는 정보를 담는 논리적인 단위
- 모든 프로그램은 파일로 구성되어 있고, 파일을 사용
- 가장 기본적인 정보 저장 단위
- 파일과 디렉토리
- 파일의 기본 체계 – 파일 vs 디렉토리
- 디렉토리 (Directory)
- 폴더 또는 디렉토리로 불림
- 파일과 다른 디렉토리를 포함할 수 있음
- 파일 (File)
- 컴퓨터에서 정보를 저장하는 논리적인 단위 (wikipedia)
- 파일은 파일명과 확장자로 식별됨 (예: hello.py)
- 실행, 쓰기, 읽기 등을 할 수 있음
파일
- 파일의 종류
- 기본적인 파일 종류로 text 파일과 binary 파일로 나눔
- 컴퓨터는 text 파일을 처리하기 위해 binary 파일로 변환시킴 (예: pyc파일)
- 모든 text 파일들이 실제로는 binary 파일
- ASCII/Unicode 문자열 집합으로 저장되어 사람이 읽을 수 있음
- Binary vs Text
Binary File
- 컴퓨터만 이해할 수 있는 형태인 이진(법)형식으로 저장된 파일
- 일반적으로 메모장으로 열면 내용이 깨져 보임 (메모장 해설 불가)
- 엑셀파일, 워드 파일 등등
- 어플리케이션에 종속적
Text File
- 인간도 이해할 수 있는 형태인 문자열 형식으로 저장된 파일
- 메모장으로 열면 내용 확인 가능
- 메모장에 저장된 파일, HTML 파일, 파이썬 코드 파일 등
- 실제로 컴퓨터에 저장되기 위해서는 Binary로 만들지만, 사람이 알아들을 수 있게 하기 위해서 데이터 저장 표준(ASCII)에 맞도록 저장하게 함
Python File I/O
- 파일 열기:
f = open("<파일이름>", "접근 모드")
- 파일 닫기:
f.close()
- 파일 열기모드 (접근모드 지정)
r 읽기모드
- 파일을 읽기만 할 때 사용w 쓰기모드
- 파일에 내용을 쓸 때 사용a 추가모드
- 파일의 마지막에 새로운 내용을 추가 시킬 때 사용
File Read
- 파일 읽기
read()
: txt 파일 안에 있는 내용을 통째로 문자열로 반환readlines()
: 한 줄씩 읽어와서 List Type으로 반환함- 첫번째 시작하자마자 모든것을 메모리에 올리는 것
readline()
: 실행시마다 한 줄 씩 읽어 오기- 한 줄씩 읽어오면서 그때그때 메모리에 올리는 것
- 시간을 포기하는 대신 메모리를 얻을 수 있음
read() 예제
1 2 3 4 5 6 7 8 9 10 11
f = open("i_have_a_dream.txt", "r" ) # 대상파일이 같은 폴더에 있을 경우에 가능 contents = f.read() print(contents) f.close() ############################################### # with 구문과 함께 사용하기 # indentation이 지정되는 경우에 쓰일 수 있으며, indentation을 벗어나는 경우에 close() 됨 with open("i_have_a_dream.txt","r") as my_file: # 파일 읽어올 수 있도록 주소 지정 # 파일이 있는 곳의 주소를 연결해둔것 # my_file이라는 별칭은 indentation 벗어나는 순간 쓸 수 없음 contents = my_file.read() # 실제로 읽어와서 저장하는 부분 print (type(contents), contents)
readlines() 예제
1 2 3 4
with open("i_have_a_dream.txt", "r") as my_file: content_list = my_file.readlines() #파일 전체를 list로 반환 print(type(content_list)) #Type 확인 print(content_list) #리스트 값 출력
readline() 예제
1 2 3 4 5 6 7 8
with open("i_have_a_dream.txt", "r") as my_file: i = 0 while True: line = my_file.readline() if not line: # line에 아무것도 없을 때까지 while True문 돈다 break print (str(i) + " === " + line.replace("\n", "")) #한줄씩 값 출력 i = i + 1
예제: 단어 통계 정보 산출
1
2
3
4
5
6
7
8
9
10
with open("i_have_a_dream.txt","r") as my_file:
contents = my_file.read()
word_list = contents.split(" ")
#빈칸 기준으로 단어를 분리 리스트
line_list = contents.split("\n")
#한줄 씩 분리하여 리스트
print("Total Number of Characters :", len(contents))
print("Total Number of Words:", len(word_list))
print("Total Number of Lines :", len(line_list))
File Write
- mode=”w”, encoding=”utf8’
1
2
3
4
5
6
7
# 맥: utf-8, 윈도우: cp-949 ➡ utf-8로 통일하기
f = open("count_log.txt",'w', encoding="utf8") # 한국, 동아시아 계
for i in range(1, 11):
data = "%d번째 줄입니다.\n" % i
f.write(data)
f.close()
1
2
3
4
with open("count_log.txt",'a', encoding="utf8") as f:
for i in range(1, 11):
data = "%d번째 줄입니다.\n" % i
f.write(data)
Directory Handling
os 모듈
- 객체로 다루니까 디렉토리나 파일에 접근하는게 훨씬 용이해짐
사용법
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
import os os.mkdir("log") ############################### try: os.mkdir("abc") except FileExistsError as e: print("Already created") os.path.exist("abc") # True / False os.path.isfile("file.ipynb") ############################### 파일을 복사 import shutil source = "file.ipynb" dest = os.path.join("abc", "file.ipynb") # 둘을 합쳐줌 shutil.copy(source, dest) # "abc" + "\\" + "file.ipynb" 이렇게 사용하는것 완전 지양 # 왜냐면 OS마다 seperator의 기준값이 다르기 때문 # shutil 사용해서 path join을 권장 ############################### # 최근에는 pathlib 모듈을 사용하여 path를 객체로 다룸 # OS에 따른 path 규칙을 좀 맞춰줄 수있음 # 파일이나 디렉토리제 접근하는 것이 좀더 편해짐 >>> import pathlib >>> >>> cwd = pathlib.Path.cwd() # current directory >>> cwd WindowsPath('D:/workspace') >>> cwd.parent # 부모 폴더 WindowsPath('D:/') >>> list(cwd.parents) # 부모의 부모 폴더 [WindowsPath('D:/')] >>> list(cwd.glob("*")) [WindowsPath('D:/workspace/ai-pnpp '), WindowsPath('D:/workspace/cs50_auto_grader'), WindowsPath('D:/workspace/data-academy'), WindowsPath('D:/workspace/DSME-AI-SmartYard'), WindowsPath('D:/workspace/introduction_to_python_TEAMLAB_MOOC'), ############################### import pathlib cwd = pathlib.Path.cwd() # cwd: 현재 디렉토리 위치 # cwd.parent: 현재 디렉토리 위치보다 상위에 있는 디렉토리 # cwd.parent.parent 가능 cwd.glob('*') # generator 생성되기 떄문에 for loop 혹은 iteration 사용 필요
디렉토리가 있는지 확인하기
1 2
if not os.path.isdir("log"): os.mkdir("log")
- 예제) Log 파일 생성하기
- 1) 디렉토리가 있는지 확인
- 2) 파일이 있는지 확인
실행할 때마다 log라는 파일에 정보를 저장
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
import os if not os.path.isdir("log"): # 파일이 있는지 os.mkdir("log") if not os.path.exists("log/count_log.txt"): # 파일이 있는지 f = open("log/count_log.txt", 'w', encoding="utf8") f.write("기록이 시작됩니다\n") f.close() with open("log/count_log.txt", 'a', encoding="utf8") as f: import random, datetime for i in range(1, 11): stamp = str(datetime.datetime.now()) value = random.random() * 1000000 log_line = stamp + "\t" + str(value) +"값이 생성되었습니다" + "\n" f.write(log_line)
Pickle
- 파이썬의 객체를 영속화(persistence)하는 built-in 객체
- 데이터, object 등 실행중 정보를 저장 ➡ 불러와서 사용
- 저장해야하는 정보, 계산 결과(모델) 등 활용이 많음
- 파이썬에 특화된 바이너리 파일
- 영속화: 하나의 객체를 파일로 저장하여 기록
객체의 위치는 메모리! 실행시키려면 메모리에 올라와야함 메모리 종료 ➡ 파이썬 인터프리터 종료시 이것을 저장(영속화)하여 계속 쓰고싶으면, 이를 어떻게 가져와서 쓸까? ➡ 피클!
1
2
3
4
5
6
7
8
9
10
11
12
import pickle
f = open("list.pickle", "wb")
test = [1, 2, 3, 4, 5]
pickle.dump(test, f) # file f에 dump
f.close()
# 여기서 test를 지우더라도 피클을 load 하여 다시 가져올 수 있음
f = open("list.pickle", "rb")
test_pickle = pickle.load(f)
print(test_pickle)
f.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import pickle
class Mutltiply(object):
def __init__(self, multiplier):
self.multiplier = multiplier
def multiply(self, number):
return number * self.multiplier
muliply = Mutltiply(5)
muliply.multiply(10)
f = open("multiply_object.pickle", "wb")
pickle.dump(muliply, f) # 영속화
f.close()
del muliply # 삭제
f = open("multiply_object.pickle", "rb") # 가져와서 쓸 수 있음
multiply_pickle = pickle.load(f)
multiply_pickle.multiply(5)