본문 바로가기

Programing/Python

[Python 입문] 12. 파이썬 파일 읽고, 쓰기

 앞서 공부를 하면서 '입력'을 받을 때는 사용자가 직접 입력하고, '출력'할 때는 화면에 결과값을 출력하는 등 모든 입력과 출력을 터미널(CMD) 창에서 확인할 수 있었다. 하지만 실제 현업에서 사용되는 프로그램은 꼭 그렇지만은 않다고 한다.

 어떤 정보를 생성해 파일(사진, 동영상)로 저장하기도 하고, 파일(메모장, 에디터)을 수정하기도 한다. 

 이번에는 파일을 통한 입출력 방법에 대해 알아본다. 파일을 새로 만든 다음 프로그램에 의해 만들어진 결과값을 새 파일에 쓰고 읽어본다.

 

목차

  • 파일 생성
  • with문 사용
  • 파일 쓰기
  • 기존 파일에 새로운 내용 추가하기
  • 파일 읽기

파일 읽고, 쓰기

1. 파일 생성

 아래와 같은 소스코드를 에디터(Pycharm 등)로 작성해서 저장한 후 실행해본다.(출력은 되지 않을 것이다.)

 에디터를 통해 설정된 경로에 내용이 비어있는 새로운 파일('asd.txt')이 하나 생성된 것을 확인할 수 있다.

f = open("asd.txt", 'w')
f.close()

 

생성된 비어있는 새로운 파일

 파일을 생성하기 위해 파이썬 내장 함수인 open을 사용했다. open함수는 아래 구조와 같이 '파일 이름'과 '파일 열기 모드'를 입력값으로 받고 결과값으로 파일 객체를 돌려준다.

파일 객체 = open("파일 이름", '파일 열기 모드')

 그리고 파일 열기 모드는 다음과 같은 기본 모드가 있다. (다른 모드는 기회가 된다면 알아보자...)

파일 열기 모드 설명
r 읽기 모드 - 파일을 읽기만 할 때 사용
w 쓰기 모드 - 파일에 내용을 쓸 때 사용
a 추가 모드 - 파일의 마지막에 새로운 내용을 추가할 때 사용

 파일 쓰기 모드로 열게 되면 해당 파일이 이미 존재하는 경우 기존 내용이 모두 사라지면서 새로운 내용으로 변경되고, 해당 파일이 존재하지 않는 경우 새로운 파일이 생성된다. 

 

 앞서 생성해본 asd.txt와 같이 새로운 파일을 생성할 때 아무런 명시를 하지 않으면 실행된 소스코드 및 프로그램(에디터)과 같은 경로에서 파일이 생성된다. 만약, 원하는 디렉토리에 생성하고 싶다면 다음과 같이 경로를 지정해주면 된다. (참고로 Mac과 Window의 경로 설정 예시를 아래와 같이 설명하고, 필자의 경우 Mac기준으로 진행한다.)

# Mac기준 경로 설정
f = open("/Users/HenryKim/Documents/asd.txt", 'w')
f.close()

# Window기준 경로 설정
f = open("C:/Python/asd.txt", 'w')
f.close()

  이때까지 작성한 소스코드를 보면 f.close()가 있는 이 부분은 열려있는 파일 객체를 닫아주는 역할을 한다. 프로그램을 종료할 때 파이썬 프로그램이 열려있는 파일의 객체를 자동으로 닫아주기 때문에 이 문장은 생략해도 된다. 하지만 쓰기 모드로 열었던 파일을 닫지 않고 다시 사용하려고 하면 오류가 발생하기 때문에 f.close()를 사용해 열려있는 파일을 직접 닫아주는 것이 좋다.

 

 

2. with문 사용

 파일을 열면 앞서 설명한 것과 같이  close()를 통해 닫아주는 것이 좋다. 하지만 아래와 같이 with문을 사용해 파일을 열고 닫는 것을 자동으로 처리할 수 있는 방법이 있다.

with open("abc.txt", "w") as f:
	f.write("Life is too short, you need python")

 위 소스코드와 같이 with문을 사용하면 with 블록을 벗어나는 순간 열린 파일 객체 f가 자동으로 close된다.

 

 

3. 파일 쓰기

 파일을 만들었지만 정작 아무것도 쓰지 않았다. 에디터를 통해 파일에 출력값(데이터)을 써보자. 쓰는 방법은 간단하다. 그동안 결과값을 출력하기 위해 사용했던 print() 대신에 파일 입출력 메소드인 write() 함수를 사용하면 된다. 아래의 소스코드를 통해 비교해볼 수 있다.

# writedata.py
f = open("/Users/HenryKim/Documents/asd.txt", 'w') <---- 해당 경로에 쓰기
for i in range(1, 5):   <---- 1부터 4까지 i에 대입
    data = "{0}번째 줄입니다.\n" .format(i)
    f.write(data)   <---- data를 파일 객체 f에 써라
f.close()

# Basic
for i in range(1, 5)   <---- 1부터 4까지 i에 대입
	data = "{0}번째 줄입니다.\n" .format(i)
    print(data)   <---- data를 출력해라

asd.txt에 작성된 내용

 그런데 쓰기 모드는 파일을 열게 되면 해당 파일이 이미 존재하는 경우 기존 내용이 모두 사라지면서 새로운 내용으로 변경된다.

 

 

4. 기존 파일에 새로운 내용 추가하기

 이미 존재하는 파일에 새로운 내용을 추가하고 싶을 경우 파일을 추가 모드('a')를 통해 아래와 같이 내용을 추가할 수 있다.

# add.py
f = open("/Users/HenryKim/Documents/asd.txt", 'a')   <---- 해당 경로에 추가
for i in range(5, 11):   <---- 5부터 10까지 i에 대입
    data = "{0}번째 줄입니다.\n" .format(i)
    f.write(data)
f.close()

asd.txt.에 내용 추가

 기존의 내용이 유지하면서 다른 내용이 추가된 것을 확인할 수 있다. (파일이 이미 존재할 경우, 삭제하지 않고 에러를 띄우는 쓰기 모드도 존재한다고 하는데 더 알아봐야 할 것 같다.)

 

 

5. 파일 읽기

 앞에서는 파일에 써봤으니 이제 파일을 읽어보자. 아래의 함수들을 사용해서 파일을 읽을 수 있다.

 

5.1. readline() 함수 사용

 첫 번째로 사용할 수 있는 함수는 readline() 함수로 해당 함수를 아래와 같이 사용하면 파일의 첫 번째 줄을 읽어 출력한다.

# readline.py
f = open("/Users/HenryKim/Documents/asd.txt", 'r')
line = f.readline()
print(line)
f.close()
1번째 줄입니다.

 만약 첫 번째 줄이 아닌 모든 라인을 읽어서 출력하고 싶으면 아래와 같이 소스코드를 작성해서 실행하면 된다.

# readline_all.py
f = open("/Users/HenryKim/Documents/asd.txt", 'r')
while True:
    line = f.readline()
    if not line: break
    print(line, end = '')
f.close()
1번째 줄입니다.
2번째 줄입니다.
3번째 줄입니다.
4번째 줄입니다.
5번째 줄입니다.
6번째 줄입니다.
7번째 줄입니다.
8번째 줄입니다.
9번째 줄입니다.
10번째 줄입니다.

 위 소스코드는 while True: 라는 무한 루프 안에서 f.readline()을 사용해 계속 파일을 한 줄씩 읽어 들이도록 하고, 만약 더 이상 읽을 라인이 없으면 break를 수행한다는 뜻이다.

 

5.2. readlines() 함수 사용

 두 번째 방법은 readlines() 함수를 사용하는 방법이다. readlines() 함수는 아래의 소스코드와 같이 사용해서 파일의 모든 라인을 읽어서 각각의 줄을 리스트로 반환할 수 있다. 결과는 위의 readline() 함수와 같다

# readlines.py
f = open("/Users/HenryKim/Documents/asd.txt", 'r')
lines = f.readlines()
for line in lines:
    print(line, end='')
f.close()

 

5.3. read() 함수 사용

 마지막으로 read() 함수의 경우, 매우 단순하다. 파일의 내용 전체를 문자열로 반환한다. 따라서 파일의 전체 내용이라고 생각하면 될 것 같다. 결과는 역시 위의 readline() 함수와 같다.

f = open("/Users/HenryKim/Documents/asd.txt", 'r')
data = f.read()
print(data)
f.close()

 

 

내용 출처: 책 '점프 투 파이썬'의 내용