본문 바로가기
TIL/Python | Django

2021.5.16 TIL : [Python] 기초 문법7 - 파일 사용하기

by yeon_zoo 2021. 5. 16.

1. 파일에 문자열 쓰기, 읽기

파일에 문자열을 사용할 때는 open함수로 파일을 열어서 파일 객체를 얻은 뒤에 write 메서드를 사용하면 된다.

file = open('hello.txt', 'w')
file.write('Hello, world!')
file.close

위의 코드를 실행한 이후에 같은 폴더 내에 hello.txt라는 파일이 존재함을 확인할 수 있다.

 

파일을 사용하기 위해 먼저 open 함수로 파일 객체를 얻어야 하고, 파일 이름을 지정해 준 후, 파일 모드를 지정해 주면 된다. 이 때 파일 모드 'w'는 write의 w이다.

 

파일을 읽을 때도 open함수로 파일을 열어서 파일 객체를 얻은 뒤 read 메서드로 파일의 내용을 읽으면 된다. 이 때 파일 모드는 read의 'r'이다.

file = open('hello.txt', 'r')
s = file.read()
print(s)
file.close()

매번 file.close()로 닫기 번거롭기 때문에 파일을 다 사용하고 나면 자동으로 닫아주도록 할 수도 있다.

with open('hello.txt', 'r') as file:
	s = file.read()
	print(s)

위처럼 with as를 사용하고 코드를 indent를 이용해서 file을 열고 난 후 실행할 코드만을 표시해주면, 사용 이후 자동으로 파일 객체를 닫아줄 수 있다. 


2. 문자열 여러 줄을 파일에 쓰기, 읽기

문자열 여러 줄을 파일에 쓰는 방법은 간단히 반복문을 사용하여 해결할 수 있다.

with open('hello.txt', 'w')as file:
	for i in range(3):
		file.write('Hello, world!' {0}\n'.format(i))

위의 코드에 따른 출력 결과는 다음과 같다.

Hello, world! 0
Hello, world! 1
Hello, world! 2

파일에 문자열 여러 줄을 저장할 때 주의해야 할 부분은 개행 문자 부분이다. 'Hello, world! {0}\n'와 같이 문자열 끝에 개행 문자 \n을 지정해 주어야 줄바꿈이 된다. 만약 \n을 붙이지 않으면 문자열이 모두 한 줄로 붙어서 저장된다. 

 

리스트에 들어있는 문자열을 파일에 쓰는 방법도 있다.

lines = ['안녕하세요.\n', '일개 대학생의\n', '블로그입니다.\n']
 
with open('hello.txt', 'w') as file:    # hello.txt 파일을 쓰기 모드(w)로 열기
    file.writelines(lines)

writelines를 통하면 리스트에 들어있는 문자열을 파일에 써줄 수 있다. 특히 writelines를 사용할 때는 반드시 리스트 내 각 문자열 끝에 \n을 붙여주어야 한다. 그렇지 않으면 문자열이 모두 한 줄로 붙어서 저장된다.

 

파일 내용을 한 줄씩 리스트로 가져올 수도 있다.

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 조건문을 활용한다. 

readline은 더 이상 읽을 줄이 없을 때 빈 문자열('')을 반환하는데, 이런 특성을 이용하여 반복문을 작성할 수 있다. 주의해야 할 점은 line 변수의 초기화를 ''(빈 문자열)로 하면 반복문을 진행시키지 못한다는 점이다. 또한 문자열을 출력할 때는 strip매서드를 이용해서 개행 문자를 삭제했다. print()는 이미 줄바꿈을 실시하기 때문에 strip시키지 않으면 줄바꿈이 두번 일어나게 된다. 

 

혹은 for문을 이용해서 사용할 수도 있다. 이 경우는 파이썬이기 때문에 가능한 부분이다.

with open('hello.txt', 'r') as file:
	for line in file:
    	print(line.strip('\n'))

※참고 | 파일 객체는 이터레이터

파일 객체는 이터레이터이다. 따라서 변수 여러 개에 저장하는 언패킹도 가능하다. 단, 이 때는 할당하는 변수의 개수와 파일에 저장된 문자열의 수가 동일해야 한다. 

>>> file = open('hello.txt', 'r')
>>> a, b, c = file
>>> a, b, c
('안녕하세요.\n', '일개 대학생\n', '블로그입니다.\n')

3. 파이썬 객체를 파일에 저장하기, 가져오기

파이썬은 객체를 파일에 저장하는 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:
    pickle.dump(name, file)
    pickle.dump(age,file)
    pickle.dump(address,file)
    pickle.dump(scores,file)

위의 코드를 실행하면 .py 파일이 있는 폴더에 james.p 파일이 생성된다. .p 확장자는 pickle의 p를 사용했지만 다른 확장자를 사용해도 무관하다. pickle.dump로 객체를 저장할 때는 open('james.p', 'wb')와 같이 파일 모드를 'wb'로 지정해야 한다. b는 바이너리를 뜻하는데, 바이너리 파일은 컴퓨터가 처리하는 파일 형식으로 텍스트 편집기로 열어도 사람이 알아보기 어렵다.

 

다음으로 파일에서 파이썬 객체를 읽어오는 언피클링을 할 수 있다. 언피클링은 pickle 모듈의 load를 사용한다. 그리고 언피클링을 할 때는 반드시 파일모드를 읽기 모드 'rb'로 해야 한다. 

import pickle

with open('james.p', 'rb') as file:
    name = pickle.load(file)
    age = pickle.load(file)
    address = pickle.load(file)
    scores = pickle.load(file)
    print(name)
    print(age)
    print(address)
    print(scores)

※참고 | 다른 파일 모드는 없나요?

사실 파일 모드는 조합에 따라 여러 종류가 있다. 읽기 'r', 쓰기 'w' 이외에 추가 'a', 배타적 생성 'x'도 있다. 추가 모드는 이미 있는 파일에서 끝에 새로운 내용을 추가할 때 사용하고, 배타적 생성 모드는 파일이 이미 있으면 에러를 발생시키고 없으면 파일을 만든다. (eXclusive creation)

이외에도 '+'을 이용하여 두 모드를 조합할 수 있다. 'r+t', 'w+t', 'r+', 'w+' 'r+b' 'w+b' 등으로 조합할 수 있으며 읽기 쓰기 모드인 것은 같지만 파일 처리 방법이 조금씩 다르다. 

 

출처 : [코딩도장 파이썬] https://dojang.io/mod/page/view.php?id=2325

댓글