day 5 파일 사용하기
파일 사용하기
파일에서 문자열을 읽고 쓰는 방법과 파이썬 객체를 파일에 읽고 쓰는 방법을 알아보겠습니다.
파일에 문자열 쓰기, 읽기
- 파일객체 = open(파일이름, 파일모드)
- 파일객체.write(‘문자열’)
- 파일객체.close()
file = open('hello.txt', 'w') # hello.txt 파일을 쓰기 모드(w)로 열기. 파일 객체 반환
file.write('Hello, world!') # 파일에 문자열 저장
file.close() # 파일 객체 닫기
file = open('hello.txt', 'r') # hello.txt 파일을 읽기 모드(r)로 열기. 파일 객체 반환
s = file.read() # 파일에서 문자열 읽기
print(s) # Hello, world!
file.close() # 파일 객체 닫기
with open('hello.txt', 'r') as file: # hello.txt 파일을 읽기 모드(r)로 열기
s = file.read() # 파일에서 문자열 읽기
print(s) # Hello, world!
read로 파일을 읽고나서 close를 사용하지 않았습니다. 이처럼 with as를 사용하면 파일 객체를 자동으로 닫아줍니다.
반복문으로 문자열 여러 줄을 파일에 쓰기
with open('hello.txt', 'w') as file: # hello.txt 파일을 쓰기 모드(w)로 열기
for i in range(3):
file.write('Hello, world! {0}\n'.format(i))
hello.txt
Hello, world! 0
Hello, world! 1
Hello, world! 2
파일객체.writelines(문자열리스트)
lines = ['안녕하세요.\n', '파이썬\n', '코딩 도장입니다.\n']
with open('hello.txt', 'w') as file: # hello.txt 파일을 쓰기 모드(w)로 열기
file.writelines(lines)
with open('hello.txt', 'r') as file: # hello.txt 파일을 읽기 모드(r)로 열기
lines = file.readlines()
print(lines)
['안녕하세요.\n', '파이썬\n', '코딩 도장입니다.\n']
파일의 내용을 읽기
만약 파일의 내용을 한 줄씩 순차적으로 읽으려면 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 삭제하여 출력
with open('hello.txt', 'r') as file: # hello.txt 파일을 읽기 모드(r)로 열기
for line in file: # for에 파일 객체를 지정하면 파일의 내용을 한 줄씩 읽어서 변수에 저장함
print(line.strip('\n')) # 파일에서 읽어온 문자열에서 \n 삭제하여 출력
참고 | 파일 객체는 이터레이터
파일 객체는 이터레이터입니다. 따라서 변수 여러 개에 저장하는 언패킹(unpacking)도 가능합니다(이터레이터는 ‘Unit 39 이터레이터 사용하기’ 참조).
>>> file = open('hello.txt', 'r')
>>> a, b, c = file
>>> a, b, c
('안녕하세요.\n', '파이썬\n', '코딩 도장입니다.\n')
물론 a, b, c = file과 같이 사용하려면 hello.txt에는 문자열 3줄이 들어있어야 합니다. 즉, 할당할 변수의 개수와 파일에 저장된 문자열의 줄 수가 일치해야 합니다.
파이썬 객체를 파일에 저장하기
파이썬 객체를 파일에 저장하는 과정을 피클링(pickling)이라고 하고, 파일에서 객체를 읽어오는 과정을 언피클링(unpickling)이라고 합니다.
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)
print(name)
print(age)
print(address)
print(scores)
..
..
james
17
서울시 서초구 반포동
{'korean': 90, 'english': 95, 'mathematics': 85, 'science': 82}
참고 | 다른 파일 모드는 없나요?
사실 파일 모드는 조합에 따라 여러 종류가 있습니다. 읽기 ‘r’, 쓰기 ‘w’ 이외에 추가 ‘a’, 배타적 생성 ‘x’도 있습니다. 추가 모드는 이미 있는 파일에서 끝에 새로운 내용을 추가할 때 사용하고, 배타적 생성 모드는 파일이 이미 있으면 에러(FileExistsError)를 발생시키고 없으면 파일을 만듭니다. ‘x’는 베타적 생성(exclusive creation)의 x입니다
또한, 파일의 형식도 함께 지정할 수 있는데, 텍스트 모드 ‘t’와 바이너리 모드 ‘b’가 있습니다. 이 파일 형식과 읽기, 쓰기 모드를 조합한 텍스트 모드 ‘rt’, ‘wt’는 파일을 텍스트 모드로 엽니다. 특히 텍스트 모드는 생략할 수 있어서 그냥 ‘r’, ‘w’도 텍스트 모드입니다. 그리고 바이너리 모드 ‘rb’, ‘wb’ 등은 피클링을 사용하거나 바이너리 데이터를 직접 저장할 때 사용합니다.
그다음에 ‘+’가 있는데 파일을 읽기/쓰기 모드로 엽니다. 이 모드는 ‘r+t’, ‘w+t’, ‘r+’, ‘w+’, ‘r+b’, ‘w+b’ 등으로 조합할 수 있으며 읽기/쓰기 모드인 것은 같지만 파일 처리 방법이 조금씩 다릅니다.
지금까지 나온 파일 모드 조합을 그림으로 정리하면 다음과 같은 구조가 됩니다.
Leave a comment