파일 입출력의 중요성
안녕하세요. 이번에는 파이썬 파일 입출력에 대해 알아보겠습니다. 프로그래밍에서 파일 처리는 매우 중요한 부분입니다. 왜 파일 입출력이 중요할까요? 데이터를 영구적으로 저장하고 불러오기 위해서입니다.
컴퓨터 메모리는 휘발성이라 전원이 꺼지면 데이터가 소멸됩니다. 하지만 파일에 기록된 데이터는 영구적으로 보관되므로 다음에 프로그램을 실행할 때 불러올 수 있습니다.
파일 입출력은 다음과 같은 경우에 필수적입니다.
- 애플리케이션 사용자 데이터 저장 (고객 정보, 게임 기록 등)
- 로그 파일 관리 (오류 기록, 프로그램 활동 기록)
- 데이터 분석에 사용할 데이터 저장 및 불러오기
- 설정 파일 관리 (프로그램 설정값 저장)
- 문서 파일 생성 및 편집
파이썬에서는 파일 처리를 위해 내장 함수와 메서드를 제공합니다. 그렇다면 구체적으로 어떤 방식으로 파일 입출력을 수행할 수 있는지 알아보겠습니다.
파일 열기와 종료
먼저 파일을 열어야 읽기/쓰기 작업을 할 수 있습니다. 다음과 같이 open() 내장 함수를 사용합니다.
file = open("file_path/file_name.txt", "r")
open() 함수에는 두 개의 인자를 전달합니다.
- 파일 경로와 이름: 파일 경로를 포함한 완전한 파일명을 지정합니다.
- 모드(mode): 파일을 어떤 목적으로 열지를 지정합니다. r 은 읽기 모드(read), w는 쓰기 모드(write), a는 추가 모드(append)입니다.
파일을 열면 파일 객체가 반환되는데, 이 객체를 통해 파일에 대한 작업을 수행할 수 있습니다. 작업이 완료되면 아래와 같이 close() 메서드로 파일을 꼭 닫아주어야 합니다.
file.close()
하지만 파일을 닫는 것을 까먹으면 메모리 누수 등의 문제가 생길 수 있습니다. 이를 방지하기 위해 다음과 같이 with 문을 사용하는 것이 좋습니다.
with open("file_path/file_name.txt", "r") as file:
# 파일 읽기 작업 수행
...
# with 블록을 벗어나면 자동으로 파일이 닫힘
with 문을 사용하면 블록이 종료되면서 파일이 자동으로 닫히므로 close()를 호출할 필요가 없어 안전합니다.
파일 읽기
파일을 열었다면 파일에서 데이터를 읽어올 수 있습니다. 어떤 방식으로 읽어올지에 따라 다음과 같은 메서드가 있습니다.
- read(): 파일 전체를 문자열로 읽어옵니다.
- readline(): 파일에서 한 줄을 읽어옵니다.
- readlines(): 파일의 모든 줄을 요소로 갖는 리스트를 반환합니다.
# read() 사용 예시
with open("data.txt", "r") as file:
contents = file.read()
print(contents)
# readline() 사용 예시
with open("data.txt", "r") as file:
line = file.readline()
while line:
print(line.strip()) # 줄바꿈 문자 제거
line = file.readline()
# readlines() 사용 예시
with open("data.txt", "r") as file:
lines = file.readlines()
for line in lines:
print(line.strip())
위와 같이 파일 내용을 읽어올 수 있습니다. 상황에 맞게 적절한 메서드를 선택하면 됩니다. 대용량 파일이라면 read()보다는 readline()이나 readlines()를 사용하는 것이 메모리 관리에 유리합니다.
파일 쓰기
파일 쓰기는 두 가지 방식으로 할 수 있습니다. 하나는 새 파일을 생성하는 것이고, 다른 하나는 기존 파일에 추가하는 것입니다.
새 파일 생성하기
with open("new_file.txt", "w") as file:
file.write("Hello, World!\n")
file.write("This is a new file.")
위 코드는 "w" 모드로 열어 new_file.txt라는 새 파일을 생성하고 문자열을 기록합니다. write() 메서드를 사용하여 원하는 내용을 파일에 입력할 수 있습니다.
주의할 점은 "w" 모드로 열면 파일이 이미 존재할 경우 원래 내용이 삭제되고 새로 작성된다는 것입니다. 기존 내용을 유지하고 싶다면 "a" 모드로 열어야 합니다.
기존 파일에 추가하기
with open("existing_file.txt", "a") as file:
file.write("\nNew content added.")
위 코드는 기존 existing_file.txt 파일을 "a" 모드로 열어 새로운 내용을 추가합니다. 파일의 마지막에 새 줄로 시작하여 "New content added."가 기록됩니다.
예외 처리와 모드 활용
파일 입출력 시에는 예외 상황이 발생할 수 있습니다. 예를 들어 파일 경로가 잘못되었거나 쓰기 권한이 없는 경우 등입니다. 이럴 때는 try/except 문을 사용하여 적절히 예외를 처리해야 합니다.
try:
with open("nofile.txt", "r") as file:
contents = file.read()
print(contents)
except FileNotFoundError:
print("파일을 찾을 수 없습니다.")
위 코드에서는 존재하지 않는 "nofile.txt" 파일을 열려고 하기 때문에 FileNotFoundError 예외가 발생하게 됩니다. except 블록에서 이 예외를 잡아내어 적절히 처리할 수 있습니다.
또한 파일 모드를 다양하게 활용하면 원하는 작업을 보다 유연하게 수행할 수 있습니다. "r+" 모드로 열면 읽기와 쓰기가 동시에 가능하며, "b" 모드를 추가하면 바이너리 모드로 열 수 있습니다. 텍스트가 아닌 이미지, 동영상 등의 바이너리 파일 입출력에는 "b" 모드를 사용하세요.
파일 입출력시 주의사항
파일 입출력은 많이 사용되는 만큼 주의해야 할 점들이 있습니다.
- 파일 종료 잊지 않기: with 문을 사용하지 않는다면 반드시 close()로 파일을 닫아야 합니다.
- 실수로 덮어쓰지 않기: "w" 모드로 파일을 열면 기존 내용이 모두 사라지므로 주의해야 합니다.
- 상대/절대 경로 확인: 파일 경로를 제대로 입력했는지 확인해야 합니다.
- 파일 읽기/쓰기 권한 확인: 파일에 대한 읽기/쓰기 권한이 있는지 확인해야 합니다.
- 예외 상황 고려하기: try/except로 예외 상황을 제대로 처리해야 합니다.
실전 예시
지금까지 배운 파일 입출력 기능을 실제로 활용해볼 예제를 살펴보겠습니다.
예시 1) 로그 파일 생성하기
import datetime
def write_log(message):
now = datetime.datetime.now()
timestamp = now.strftime("%Y-%m-%d %H:%M:%S")
log_message = f"[{timestamp}] {message}\n"
try:
with open("app.log", "a") as file:
file.write(log_message)
except Exception as e:
print(f"로그 파일 쓰기 오류: {e}")
# 사용 예시
write_log("프로그램 시작")
write_log("데이터 로딩 중...")
write_log("작업 완료")
위 코드는 write_log() 함수를 통해 현재 시간과 함께 로그 메시지를 "app.log" 파일에 기록합니다. 로그 파일은 프로그램 실행 과정을 기록하는 데 유용하게 사용됩니다.
예시 2) 학생 성적 데이터 저장 및 불러오기
students = []
def save_data():
try:
with open("students.txt", "w") as file:
for student in students:
file.write(f"{student['name']},{student['grade']}\n")
except Exception as e:
print(f"파일 쓰기 오류: {e}")
def load_data():
try:
with open("students.txt", "r") as file:
for line in file:
name, grade = line.strip().split(",")
student = {"name": name, "grade": int(grade)}
students.append(student)
except Exception as e:
print(f"파일 읽기 오류: {e}")
# 사용 예시
students.append({"name": "철수", "grade": 85})
students.append({"name": "영희", "grade": 92})
save_data() # 파일에 저장
students.clear() # students 리스트 비우기
load_data() # 파일에서 불러오기
for student in students:
print(f"{student['name']}: {student['grade']}점")
위 코드는 학생 이름과 성적 정보를 갖는 딕셔너리를 리스트에 저장합니다. save_data() 함수를 통해 이 정보를 "students.txt" 파일에 저장하고, load_data() 함수로 파일에서 정보를 다시 불러옵니다.
이렇게 파일 입출력을 활용하면 프로그램 실행 간에도 데이터를 유지할 수 있습니다. 마지막 출력에서는 이전에 저장된 학생 정보를 다시 불러와 출력합니다.
파일 입출력은 프로그래밍에서 많이 사용되는 기능이므로 기본 개념을 잘 익혀두시기 바랍니다. 이번 내용을 통해 파이썬으로 파일을 읽고, 쓰고, 관리하는 방법을 충분히 이해하셨기를 바랍니다.
참고 자료
[1] 박응용 박사, "혼자 공부하는 파이썬"
2] Python Software Foundation, "파일 입력과 출력 다루기"
[3] Jose Portilla, "파일 입출력과 예외 처리"
[4] Corey Schafer, "파이썬 입문 강좌: 파일 입출력과 처리"
한 고대 문서 이야기
여기 한 고대 문서가 있습니다. 이 문서는 B.C. 1,500년 부터 A.D 100년까지 약 1,600 여 년 동안 기록되었습니다. 이 문서의 저자는 약 40 명입니다. 이 문서의 고대 사본은 25,000 개가 넘으나, 사본간 오
gospel79.tistory.com
유튜브 프리미엄 월 1만원 할인받고 월 4000원에 이용하는 방법
올해 5월부터 월 8000원 정도이던 유튜브 프리미엄 요금이 15000원 정도로 인상됩니다. 각종 OTT 서비스, ChatGPT 같은 서비스들이 늘어나다보니 이런 거 몇 개만 이용하더라도 월 이용요금이 5만원을
stock79.tistory.com
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
'IT > 파이썬 기초 완전 정복' 카테고리의 다른 글
파이썬 튜플 활용법 배우기 (11) (1) | 2024.04.20 |
---|---|
파이썬 예외 처리(try, except) 방법 (9) (1) | 2024.04.20 |
파이썬 모듈과 패키지 import 하기 (7) (0) | 2024.04.20 |
파이썬 함수 정의와 호출 방법 (6) (1) | 2024.04.20 |
파이썬 반복문(for, while) 기초 (5) (0) | 2024.04.20 |
댓글