파이썬에서는 파일을 읽거나 쓸 때 별도의 라이브러리를 임포트할 필요가 없습니다. 기본적으로 내장 기능으로 처리되기 때문입니다.
가장 먼저 할 일은 내장 함수인 open()을 사용해 파일 객체(file object)를 얻는 것입니다. open() 함수는 파일을 열고 파일 객체를 반환하며, 이 객체에는 나중에 파일 정보를 조회하거나 조작하는 데 사용할 수 있는 다양한 메서드와 속성이 포함되어 있습니다.
파일이란 무엇일까?
파일 작업을 시작하기 전에 '파일'이 정확히 무엇인지 짚고 넘어가겠습니다. 파일은 디스크 상에 관련 정보를 저장하기 위한 이름이 지정된 위치(named location)입니다. 이름과 위치를 가지므로 하드디스크에 저장됩니다.
파이썬에서 파일 작업은 다음 순서로 수행됩니다.
- 파일 열기(Open)
- 읽기 또는 쓰기 작업(Read / Write)
- 파일 닫기(Close)
파일 열기 — open() 함수
파일을 읽거나 쓰려면 내장 함수인 open()을 반드시 사용해야 합니다. 이 함수는 두 개의 인수를 받는데, 첫 번째는 파일 이름, 두 번째는 파일을 여는 목적(읽기 또는 쓰기)입니다.
파이썬에서 파일 객체를 여는 문법은 다음과 같습니다.
File_obj = open("filename", "mode")각 요소의 의미
- File_obj: 핸들(handle)이라고도 하며, 파일 객체를 저장하는 변수입니다.
- filename: 열고자 하는 파일의 이름입니다.
- mode: 인터프리터에게 파일을 어떤 방식으로 사용할지 알려주는 옵션입니다.
>>> f = open("pytube1.py") # 현재 디렉터리의 파일 열기
>>> f = open(r"c:\users\rajesh\Documents\readme.txt") # 지정한 경로에서 파일 열기모드(mode) 인수 이해하기
위 예제에서 볼 수 있듯이 open() 함수의 두 번째 인수인 모드는 선택 사항입니다. 파일을 열 때 읽기('r'), 쓰기('w'), 추가('a') 중 어떤 작업을 할지 지정할 수 있으며, 텍스트 모드로 열지 바이너리 모드로 열지도 지정할 수 있습니다.
기본 모드는 텍스트 모드이며, 이 경우 파일에서 문자열(string)을 읽어옵니다.
파이썬 파일 모드 종류
| 모드 | 설명 |
|---|---|
| 'r' | 파일을 읽기용으로 엽니다. (기본값) |
| 'w' | 파일을 쓰기용으로 엽니다. 파일이 없으면 새로 생성하고, 이미 존재하면 내용을 비웁니다(truncate). |
| 'x' | 배타적 생성(exclusive creation) 모드로 파일을 엽니다. 파일이 이미 존재하면 작업이 실패합니다. |
| 'a' | 기존 내용을 유지한 채 파일 끝에 추가(append)합니다. 파일이 없으면 새로 생성합니다. |
| 't' | 텍스트 모드로 엽니다. (기본값) |
| 'b' | 바이너리 모드로 엽니다. |
| '+' | 업데이트(읽기와 쓰기) 용으로 파일을 엽니다. |
>>> f = open("pytube1.py") # 'r' 또는 'rt'와 동일
>>> f = open("pytube1.py", "w") # 텍스트 모드로 쓰기
>>> f = open("color3.jpg", "r+b") # 바이너리 모드로 읽기+쓰기인코딩 지정하기
기본 인코딩은 운영체제에 따라 다릅니다. 윈도우에서는 'cp1252', 리눅스에서는 'utf-8'이 사용됩니다. 따라서 호환성을 위해 인코딩 타입을 명시적으로 지정하는 것이 좋습니다.
>>> f = open("pytube1.py", mode="r", encoding='utf-8')텍스트 파일 만들기
이번에는 파이썬으로 간단한 텍스트 파일을 직접 만들어 보겠습니다.
>>> # 현재 작업 디렉터리에 "textfile.txt"라는 이름의 텍스트 파일 생성
>>> f = open("textfile.txt", "w")
>>> # 위 코드는 기본 디렉터리에 textfile.txt 파일을 생성합니다.
>>> f.write("Hello, Python")
13
>≫ f.write("\nThis is our first line")
23
>>> f.write("\nThis is our second line")
24
>>> f.write("\nWhy writing more?, Because we can :)")
37
>>> f.close()
write() 메서드가 반환하는 숫자는 실제로 기록된 문자 수입니다. 코드 실행 후 현재 작업 디렉터리를 확인하면 textfile.txt라는 새 파일이 생성된 것을 볼 수 있으며, 해당 파일을 열면 작성한 내용들이 그대로 들어 있는 것을 확인할 수 있습니다.
파이썬에서 텍스트 파일 읽기
파이썬에서 텍스트 파일을 읽는 방법은 여러 가지가 있습니다.
1. read() — 전체 내용 한 번에 읽기
파일의 모든 문자를 포함하는 하나의 문자열을 추출하려면 read() 메서드를 사용합니다.
>>> f = open("textfile.txt", "r")
>>> f.read()
'Hello, Python\nThis is our first line\nThis is our second line\nWhy writing more?, Because we can :)'2. read(n) — 원하는 글자 수만큼 읽기
특정 개수의 문자만 읽고 싶다면 인수에 숫자를 넘겨주면 됩니다.
>>> f = open("textfile.txt", "r")
>>> print(f.read(13))
Hello, Python3. readline() — 한 줄씩 읽기
파일을 한 줄씩 순차적으로 읽으려면 readline() 함수를 사용합니다. 호출할 때마다 커서가 다음 줄로 이동합니다.
>>> f = open("textfile.txt", "r")
>>> print(f.readline())
Hello, Python
>>> print(f.readline())
This is our first line
>>> print(f.readline())
This is our second line
>>> print(f.readline())
Why writing more?, Because we can :)4. readlines() — 전체 줄을 리스트로 받기
파일의 모든 줄을 개별 요소로 분리해 한꺼번에 반환받고 싶다면 readlines() 함수를 사용합니다. 각 줄은 리스트의 요소로 구분됩니다.
>>> f = open("textfile.txt", "r")
>>> print(f.readlines())
['Hello, Python\n', 'This is our first line\n', 'This is our second line\n', 'Why writing more?, Because we can :)']파일 객체 순회하기
파일의 모든 줄을 가장 구조화되고 효율적인 방식으로 읽고 싶다면 for 루프를 활용하는 것이 좋습니다. 파일 객체 자체를 반복 대상으로 사용하면 메모리 효율도 뛰어납니다.
>>> f = open("textfile.txt", "r")
>>> for line in f:
print(line)
Hello, Python
This is our first line
This is our second line
Why writing more?, Because we can :)파일에 쓰기
파일에 쓰는 것은 매우 간단합니다. 파일을 연 뒤 원하는 텍스트를 전달하기만 하면 됩니다. 이 방법은 기존 파일에 데이터를 추가(append)할 때도 사용할 수 있으며, 줄바꿈 후 새로운 내용을 쓰려면 EOL 문자(\n)를 활용하면 됩니다.
>>> f = open("textfile.txt", "w")
>>> f.write("There are tons to reason to 'fall in love with PYTHON'")
54
>>> f.write("\nSee, i have added one more line :).")
36
>>> f.close()
>>> f = open("textfile.txt", "r")
>>> for line in f:
print(line)
There are tons to reason to 'fall in love with PYTHON'
See, i have added one more line :).파일 닫기
파일 작업을 마쳤다면 반드시 f.close() 명령으로 파일을 닫아야 합니다. 이렇게 하면 파일이 완전히 종료되고, 사용 중이던 모든 리소스가 해제되어 시스템이 다른 곳에 활용할 수 있게 됩니다.
파일이 닫힌 후에는 파일 객체를 사용하려는 시도마다 오류가 발생합니다.
>>> f = open("textfile.txt", "r")
>>> f.close()
>>> f.readlines()
Traceback (most recent call last):
File "<pyshell#95>", line 1, in <module>
f.readlines()
ValueError: I/O operation on closed file.with 문 — 더 안전하고 깔끔한 파일 처리
with 문은 파일 객체와 함께 사용할 수 있는 강력한 도구입니다. with 문을 사용하면 더 깔끔한 문법과 예외 처리(exception handling)를 동시에 얻을 수 있습니다.
또 하나 큰 장점은, with 블록 안에서 연 파일은 작업이 끝나는 즉시 자동으로 닫힌다는 점입니다. 덕분에 close() 호출을 깜빡해도 리소스 누수를 걱정하지 않아도 됩니다.
문법
with open("filename") as file:예제: 파일 읽기
>>> with open("textfile.txt") as f:
for line in f:
print(line)실행 결과:
There are tons to reason to 'fall in love with PYTHON'
See, i have added one more line :).
예제: 파일 쓰기 및 추가
with 문으로 파일에 쓰는 것 역시 마찬가지로 간단합니다.
>>> with open("textfile.txt", "a") as f:
f.write("\nHello, Python-Here i come once again!")
38
>>> with open("textfile.txt") as f:
for line in f:
print(line)
There are tons to reason to 'fall in love with PYTHON'
See, i have added one more line :).
Hello, Python-Here i come once again!split()으로 텍스트 파일의 줄 분리하기
파이썬의 split() 함수를 사용하면 텍스트 파일에서 가져온 줄들을 손쉽게 분리할 수 있습니다. 공백, 콜론 등 원하는 구분자를 자유롭게 지정할 수 있습니다.
공백으로 단어 분리하기
>>> with open("textfile.txt", "r") as f:
data = f.readlines()
for line in data:
words = line.split()
print(words)실행 결과:
['There', 'are', 'tons', 'to', 'reason', 'to', "'fall", 'in', 'love', 'with', "PYTHON'"]
['See,', 'i', 'have', 'added', 'one', 'more', 'line', ':).']
['Hello,', 'Python-Here', 'i', 'come', 'once', 'again!']
콜론(:)으로 분리하기
공백 대신 콜론으로 텍스트를 분리하려면 line.split()을 line.split(":")으로 변경하기만 하면 됩니다.
["There are tons to reason to 'fall in love with PYTHON'\n"]
['See, i have added one more line ', ').\n']
['Hello, Python-Here i come once again!']
마무리
지금까지 파이썬에서 파일 객체를 다루는 핵심 내용을 살펴봤습니다. open() 함수로 파일을 열고, 다양한 모드를 지정하며, read(), readline(), readlines()로 내용을 읽고, write()로 기록한 뒤, 마지막으로 with 문을 활용하면 자동으로 파일이 닫혀 안전하게 작업을 마칠 수 있습니다. 이 패턴만 익혀두면 실무에서 파일 입출력을 훨씬 안정적으로 처리할 수 있습니다.