상세 컨텐츠

본문 제목

[ Python 기초 문법 ] - 프로그램 입출력(3) - 파일 읽고 쓰기

Language/Python

by bing_su 2023. 8. 21. 10:34

본문

반응형
SMALL

지금까지는 '입력'을 받을 때는 사용자가 직접 입력하고, '출력'할 때는 화면에 결괏값을 출력하는 방식으로 프로그래밍해 왔다. 모든 입출력을 터미널(CMD) 창에서 확인할 수 있었다는 것이다. 하지만 실제 현업에서 사용되는 프로그램에는 이러한 방식만 사용되지 않는다. 우리는 어떤 정보를 생성해 파일로 저장하기도 하고, 파일을 수정하기도 한다. 이번에는 파일을 통한 입출력 방식에 대해 살펴볼 예정이다. 파일을 새로 만든 다음 프로그램이 만든 결괏값을 새 파일에 적고, 해당 내용을 읽은 후 새로운 내용을 다시 추가하는 방법도 알아볼 예정이다.

[ 파일 생성하기 ]

아래와 같은 소스코드를 에디터(Pycharm, Anaconda, Visual Studio Code 등)에 작성해서 실행해 보자. (필자는 아나콘다로 작성했음. 아나콘다 사용자 분들은 코드블록 아래 사진 그대로 따라 하시면 됩니다.

''' 자세한 내용은 아래 추가로 더 설명할 예정 '''
f = open("new.txt", 'w')  # 파일 생성을 위해 파이썬 내장 함수인 open 사용.
f.close()  # 열린 파일 객체를 닫아 주는 명령어.

Prompt에 python 입력 > 파이썬 콘솔 실행 > 코드 입력

해당 코드를 입력함으로써 프로그램을 실행하면 에디터를 통해 설정한 기본 경로에 비어있는 새로운 파일('new.txt')이 하나 생성된 것을 확인할 수 있다. (아나콘다 사용자들의 경우 (base) 옆에 있는 경로에 저장되어 있음.)

비어있는 새로운 파일이 생성됨을 확인할 수 있음.

이제 코드 내용을 본격적으로 설명해보려고 한다. 먼저, 파일을 생성하기 위해 파이썬 내장 함수인 open()을 사용했다. open 함수는 아래의 구조와 같이 '파일 이름'과 '파일 열기 모드'를 입력 값으로 받고, 결괏값으로 파일 객체를 반환한다.

File_Object = open("File name", "File Opening Mode")

파일 열기 모드에는 기본적으로 아래의 표와 같은 것들이 있다. (자세한 다른 모드는 추후에 기회가 된다면 살펴봄.)

파일 열기 모드 설명
r 읽기 모드: 파일을 읽기만 할 때 사용한다.
w 쓰기 모드: 파일에 내용을 써야 할 때 사용한다.
a 추가 모드: 파일의 마지막에 새로운 내용을 추가할 때 사용한다.

파일을 쓰기 모드로 열면 해당 파일이 이미 존재하는 경우에는 기존 내용이 모두 사라지면서 새로운 내용으로 바뀌고, 해당 파일이 존재하지 않는 경우에는 새로운 파일이 생성된다. 위의 예시에서는 디렉터리에 'new.txt'라는 파일이 없는 상태에서 쓰기 모드인 'w'로 파일을 열었기 때문에 해당 파일이 새롭게 디렉터리에 생성된 것이다.

 

새로운 파일을 생성할 때, 아무런 명시를 하지 않으면 에디터에서 기본으로 설정된 경로에서 파일이 생성된다. 만약, 원하는 디렉터리에서 파일을 생성하고 싶다면 아래와 같이 경로를 지정해 주면 된다. (Mac 기준과 Windows 기준을 아래와 같이 다 설명했는데요, 필자는 Windows 기준으로 진행합니다.) 단, 경로를 지정할 때는 해당 폴더가 존재하는 상태여야 합니다. 예를 들면, 아래의 코드에서 윈도우 기준으로는 C 드라이브 안에 'Python'이라는 폴더가 이미 생성되어 있는 상태여야 한다는 뜻.

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

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

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

※ 파일 경로와 슬래시(/)

파이썬 코드에서 파일 경로를 표시할 때 "C:/Python/new.txt"처럼 슬래시(/)를 사용할 수 있다. 만약 역슬래시(\)를 사용하고자 할 경우에는 "C:\\Python\\new.txt"처럼 역슬래시를 2개 사용하거나(escape code) r"C:\Python\new.txt"와 같이 r 문자(raw string)를 덧붙여 사용해야 한다. 왜냐하면 "C:\note\new.txt"처럼 파일 경로에 '\n'와 같은 이스케이프 문자가 있을 경우, 줄 바꿈 문자로 해석되어 의도했던 파일 경로와 달라질 수 있기 때문이다.

 

참고로 설명하자면, 기본적으로 파이썬에서 '\'는 escape code로 인식된다. 그런데 raw string(r)을 사용하면, 뒤에 나오는 문자열에서 '\'가 escape code로 해석되는 것을 방지한다.

[ with문 사용 ]

파일을 열면 앞서 설명했듯이 close 함수를 통해 닫아주는 것이 좋다. 하지만 아래와 같이 'with문'을 사용해 파일을 열고 닫는 것을 자동으로 처리할 수 있는 방법이 있다. 아래의 예시 코드와 같이 with문을 사용하면 with 블록을 벗어나는 순간 열려 있던 파일 객체 f가 자동으로 닫힌다.

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

abc.txt 파일이 생성된 것을 확인할 수 있음.

[ 파일에 내용 작성 - 쓰기 모드 사용 ]

이전까지는 파일을 쓰기 모드로 열기만 했을 뿐, 정작 아무것도 쓰지는 않았다. 이번에는 문자열 데이터를 파일에 직접 써 보는 실습을 할 것이다.

f = open("C:/Python/new.txt", 'w')  # C:/Python 경로에 new.txt 파일을 쓴다.
for i in range(1, 5):  # 1부터 4까지 변수 i에 대입하며 반복문 실행.
    data = "{0}st line.\n".format(i)  
    f.write(data)  # data 값을 파일 객체 f에 써라.
f.close()

new.txt에 작성된 내용

위의 프로그램과 아래의 프로그램 실행 결과를 비교하면 동일하게 출력된다.

for i in range(1, 5):
    data = "{0}st line.".format(i)
    print(data)

두 프로그램의 다른 점을 설명하자면, 출력하는 방식이다. 첫 번째에서 살펴본 프로그램은 파일에 데이터를 적는다. 두 번째 프로그램에서는 우리가 계속 사용해 왔던 모니터 화면에 데이터를 출력한다. 두 방식의 차이점은 데이터를 출력할 때 파일 객체 f의 write 함수를 사용했는지, print 함수를 사용했는지에 대한 것이다.

[ 기존 파일에 새로운 내용 추가 ]

쓰기 모드에서 파일을 열었을 때 해당 파일이 이미 존재하는 경우에는 기존의 내용이 모두 사라지면서 새로운 내용으로 변경된다. 그렇다면 이미 존재하는 파일에 또 다른 내용을 추가하고 싶을 경우에는 어떻게 해야 할까? 이 경우에는 추가 모드('a')를 사용하여 아래와 같이 내용을 추가할 수 있다. 아래의 예시 코드를 이용하여 실습을 해 보자.

f = open("C:/Python/new.txt", 'a')  # C:/Python 경로에 있는 new.txt 파일에 내용을 추가한다.
for i in range(5, 11):  # 5부터 10까지 변수 i에 대입하며 반복문 실행.
    data = "{0}st line.\n".format(i)  
    f.write(data)  # data 값을 파일 객체 f에 써라.
f.close()

new.txt에 새롭게 작성된 내용

위에서 작성한 기존의 내용이 유지되면서 다른 내용이 추가된 것을 확인할 수 있다.

[ 파일 읽기 ]

지금까지는 파일을 직접 쓰는 방법에 대해 다뤘다. 그런데 파이썬에서는 이미 작성된 외부 파일을 읽어서 프로그램에서 사용할 수 있는 여러 가지 방법이 존재한다. 이번에는 그 방법에 대해 조금 더 자세히 알아보자.

1. readline 함수 사용

해당 함수를 사용하면 파일의 첫 번째 줄을 읽는다. 아래의 예시 코드를 실행하면 new.txt 파일의 가장 첫 번째 줄인 "1st line."을 화면에 출력할 수 있다.

f = open("C:/Python/new.txt", 'r')  # C:/Python 경로에 있는 new.txt 파일을 읽는다.
line = f.readline()  # f 객체에 readline 함수를 사용하여 파일의 첫 번째 줄을 읽어 line 변수에 저장.
print(line)  # line 변수에 담긴 내용(파일의 첫 번째 줄 내용) 출력.
f.close()

# 출력 화면
1st line.

아래와 같은 예시 코드를 작성하여 실행하면, 첫 번째 줄이 아닌 모든 줄을 읽어서 출력할 수 있다.

f = open("C:/Python/new.txt", 'r')
while True:  # 무한 루프
    line = f.readline()
    # readline 함수는 더 이상 읽을 줄이 없을 때 None을 반환한다.
    if not line: break  # line 변수에 담긴 내용이 없을 경우 -> 반복문 종료
    print(line, end = '')
f.close()

# 출력 화면
1st line.
2st line.
3st line.
4st line.
5st line.
6st line.
7st line.
8st line.
9st line.
10st line.

해당 프로그램을 아래의 프로그램과 비교해 보자.

while 1:
    data = input()  # 사용자의 입력을 data 변수에 저장함.
    if not data: break  # 입력된 data가 없으면 반복문 종료
    print(data)

두 프로그램은 입력을 받는 방식에서 차이가 있다. 첫 번째 예시는 파일을 사용하여 입력을 하여 파일에 있는 내용을 출력하는 예제였다. 두 번째는 키보드를 사용하여 사용자가 입력한 내용을 출력하는 예제였다.

2. readlines 함수 사용

해당 함수는 파일의 모든 줄을 읽어서 각 줄을 요소로 가지는 리스트를 반환한다. 아래의 예시 코드를 실행하며 해당 함수에 대해 조금 더 자세히 이해해 보자.

f = open("C:/Python/new.txt", 'r')
lines = f.readlines()  # 각 줄의 내용이 요소로 있는 리스트 lines 생성.
for line in lines:  # lines 리스트에 저장된 요소를 line 변수에 하나씩 대입하며 반복문 실행.
    print(line, end = '')  # line 변수에 담긴 내용 출력.
f.close()

# 출력 화면
1st line.
2st line.
3st line.
4st line.
5st line.
6st line.
7st line.
8st line.
9st line.
10st line.

3. read 함수 사용

read 함수는 파일의 모든 내용을 문자열로 반환한다. 따라서 아래의 예시 코드를 실행하면 파일 전체의 내용을 출력할 수 있다.

f = open("C:/Python/new.txt", 'r')
data = f.read()
print(data)
f.close()

 

반응형
LIST

관련글 더보기

댓글 영역