-
TIL. 21 파일 사용하기TIL 2020. 10. 29. 22:46728x90
## 파일 사용하기
## 프로그래밍에서 중요한 축을 차지하는 부분이 파일 처리이다.
## 파일에 문자열 사용하기
## 파일에 문자열을 쓸 때는 open 함수로 파일을 열어서 파일 객체(file object)를 얻은 뒤에 write 메서드를 사용합니다.
# 파일객체 = open(파일이름, 파일모드)
# 파일객체.write('문자열')
# 파일객체.close()
## IDLE로 아래 코드 입력
file = open('hellow.txt', 'w') # hello.txt 파일을 쓰기 모드(w)로 열기. 파일 객체 반환
file.write('Hellow, cordermun') # 파일에 문자열 저장
file.close() # 파일 객체 닫기
# 위와 같이 입력하며 'hellow.txt' 파일이 저장될 경로와 이름을 지정해준다.(지정한이름으로의.py 파일이 만들어지고 hello.txt 파일을 생성한다)
# open 함수로 파일을 열고, 'w' -> 쓰기모드로 파일 모드를 지정해준다. (write)
# 'w' 상태의 파일로 직접 작성할 수 있으며 작성된 문자열을 파일에 저장한다.
# 어떠한 행위를 마무리하고는 반드시 close를 이용해 파일 객체를 닫아줘야한다.
## 위에서 작성한 파일의 문자열 읽기
## 파일을 읽을 때도 open 함수로 파일을 열어서 파일 객체를 얻은 뒤 read 메서드로 파일의 내용을 읽습니다.
## 단, 이때는 파일 모드를 읽기 모드 'r'로 지정합니다.
# 변수 = 파일객체.read()
file = open('hellow.txt', 'r') # hellow.txt 파일을 읽기 모드(r)로 열기. 파일 객체 반환
s = file.read() # 파일에서 문자열 읽기
print(s) # Hellow, codermun
file.close() # 파일 객체 닫기
## 위에서 작성된 파일에서 문자열을 읽는 방법이다.
## open함수로 해당 파일을 열고, 'r' --> 읽기모드로 파일 모드를 지정해준다.(read)
## 임의의 변수를 할당하여 read의 반환값의 내용을 읽을 수 있다.
## Hellow, codermun이 출력됨을 확인할 수 있다
## 여기서도 모두 마무리하고 반드시 close를 이용해 파일 객체를 닫아줘야한다.
## 자동으로 파일 객체 닫기
## python에서는 일일이 close하는 과정을 줄이기 위해
## 파이썬에서는 with as를 사용하면 파일을 사용한 뒤 자동으로 파일 객체를 닫아준다.
## 아래와 같이 with 다음에 open으로 파일을 열고 as 뒤에 파일 객체를 지정한다.
# with open(파일이름, 파일모드) as 파일객체:
# 코드
with open('hello.txt', 'r') as file: # hello.txt 파일을 읽기 모드(r)로 열기
s = file.read() # 파일에서 문자열 읽기
print(s) # Hello, world!
## read를 사용해도 파일을 닫지 않고 마무리해도 에러없이 잘 작동한다
## 문자열 여러줄을 파일에 쓰기, 읽기
## 문자열을 여러줄 입력할때는 반복문을 사용해주면 된다.
with open('hello.txt', 'w') as file: # hello.txt 파일을 쓰기 모드(w)로 열기
for i in range(3):
file.write('Hello, world! {0}\n'.format(i))
## open 함수와 'w' 모드로 파일 열기
## for 문과 formatting을 이용해 여러줄의 문자열을 입력할 수 있다
## 리스트 안의 문자열을 파일에 쓰기
# 파일객체.writelines(문자열리스트)
lines = ['안녕하세요.\n', '파이썬\n', '코딩 도장입니다.\n']
with open('hello.txt', 'w') as file: # hello.txt 파일을 쓰기 모드(w)로 열기
file.writelines(lines)
# 파일객체.writelines(리스트)를 이용해 리스트 안의 문자열을 파일에 작성할 수 있다
## 여기서 리스트 안의 요소는 \n 이 적용되면 여러줄이 입력된다
## \n이 없으면 위 요소는 한줄로 입력된다.
## 파일의 내용을 한줄씩 리스트로 가져오기
## read는 파일의 내용을 읽어서 문자열로 가져오지만 readlines는 파일의 내용을 한 줄씩 리스트 형태로 가져옵니다..
# 변수 = 파일객체.readlines()
with open('hello.txt', 'r') as file: # hello.txt 파일을 읽기 모드(r)로 열기
lines = file.readlines()
print(lines)
# ['안녕하세요\n', '파이썬\n', '코딩도장입니다\n'] 출력
## 파일의 내용을 한줄씩 읽기
# 파일의 내용을 한 줄씩 순차적으로 읽으려면 readline을 사용한다.
# 변수 = 파일객체.readline()
with open('hello.txt', 'r') as file: # hello.txt 파일을 읽기 모드(r)로 열기
line = None # 변수 line을 None으로 초기화
while line != '':
line = file.readline()
print(line.strip('\n')) # 파일에서 읽어온 문자열에서 \n 삭제하여 출력
## 보통 어떤 파일을 열때는 해당 파일에 문자열이 몇개있는지 알 수 없다.
## 따라서 while 반복문을 사용해야한다(반복횟수가 정해져있지 않을때)
## line = None 으로 지정하는 이유
## readlined 메서드는 더 이상 읽을 줄이 없을때 빈 문자열을 반환한다.
## 이 특성을 이용해 while의 조건식을 만든다
## 먼저 line 이라는 변수를 만들어주지 않으면 while 조건에서 빈 문자열과의 비교대상이 없기에 error가 발생한다.
## 또한, line을 '' 빈문자열로 초기화하면 처음 조건부터 맞지 않아 반복문이 실행되지 않는다.
## line = [] 로 지정해도 같은 결과가 확인된다.(?)
## line = file.readline() ## 파일의 내용을 한줄씩 순차적으로 line 이라는 변수에 할당하고 출력하고 할당하고 출력하고를 반복한다.
## strip 메서드를 이용해 \n을 삭제하고 출력해야 한다 삭제하지 않을 경우 줄바꿈이 2번 일어난다 (print 디폴트로 줄바꿈이 되어있다)
## for 문으로 파일의 내용을 줄 단위로 읽기
with open('hello.txt', 'r') as file: # hello.txt 파일을 읽기 모드(r)로 열기
for line in file: # for에 파일 객체를 지정하면 파일의 내용을 한 줄씩 읽어서 변수에 저장함
print(line.strip('\n')) # 파일에서 읽어온 문자열에서 \n 삭제하여 출력
## for 문을 사용하면 조금 더 간편한것 같다.
## readline을 쓰지 않기 때문
## 파이썬 객체를 파일에 저장하기, 가져오기
# 파이썬은 객체를 파일에 저장하는 pickle 모듈을 제공합니다.
# 다음과 같이 파이썬 객체를 파일에 저장하는 과정을 피클링(pickling)이라고 하고,
# 파일에서 객체를 읽어오는 과정을 언피클링(unpickling)이라고 한다.
## pickle
# 피클링은 pickle 모듈의 dump 메서드를 사용합니다.
import pickle
name = 'james'
age = 17
address = '서울시 서초구 반포동'
scores = {'korean': 90, 'english': 95, 'mathematics': 85, 'science': 82}
with open('james.p', 'wb') as file: # james.p 파일을 바이너리 쓰기 모드(wb)로 열기
pickle.dump(name, file)
pickle.dump(age, file)
pickle.dump(address, file)
pickle.dump(scores, file)
## IDLE로 코드를 실행하면 james.p 라는 파일명으로 파일이 생성된다.
## 여기서 피클 -> 파일로 저장하는 단계이므로 모드는 'wb'를 입력하며 wb == writebinary라는 뜻이다.
## binary 파일은 컴퓨터가 처리하는 방식의 파일로 텍스트파일과 같이 사람이 알아보기는 어렵다.
## unpickle
# 파이썬 객체를 읽어오는 언피클링
# 언피클링은 pickle 모듈의 load를 사용한다.
# 그리고 언피클링을 할 때는 반드시 파일 모드를 바이너리 읽기 모드 'rb'로 지정해야 한다.
import pickle
with open('james.p', 'rb') as file: # james.p 파일을 바이너리 읽기 모드(rb)로 열기
name = pickle.load(file)
age = pickle.load(file)
address = pickle.load(file)
scores = pickle.load(file)
print(name)
print(age)
print(address)
print(scores)
# james
# 17
# 서울시 서초구 반포동
# {'korean': 90, 'english': 95, 'mathematics': 85, 'science': 82}
## 앞써 pickle dump 메서드를 4번 사용하였기 때문에
## 마찬가지로 파일에서 객체(값)을 가져올때 pickl.load를 4번 사용해야 합니다
## name age address scores 순서대로 입력하여 load 시도 순서대로 입력해야한다고 하지만
## 순서가 바뀌어도 문제없이 동작한다. 혹시모르니 순서대로 입력하도록 하자
728x90'TIL' 카테고리의 다른 글
TIL.23 N-gram 만들기 (0) 2020.10.31 TIL. 22 회문 판별하기 (0) 2020.10.30 TIL. 20 set_조작하기_2 (0) 2020.10.28 TIL.19 set 조작하기 (0) 2020.10.27 TIL. 18 Dictionary 조작하기 (0) 2020.10.26