[Python 내장 함수] open() : 파일을 읽고, 쓰기

 

 


1. open() 함수란?

 

파이썬에서 제공하는 기본 내장 함수 중 하나인 open() 함수는 파일을 열고 파일 객체를 반환하는 함수입니다. 이 함수를 사용하면 파일을 읽거나 쓸 수 있습니다. 파일을 사용한 후에는 close() 메서드를 호출하여 파일을 닫아야합니다. with 구문을 이용하면 파일을 자동으로 닫을 수 있어 편리하게 사용할 수 있습니다. 파일을 열 때 인코딩을 지정하지 않으면 기본 인코딩 방식이 사용됩니다.

 

open() 함수의 구문은 아래와 같습니다.

 

  • file: 열고자 하는 파일의 경로와 이름을 나타냅니다.
  • mode: 파일을 열 때 사용할 모드를 나타냅니다. 기본값은 'r'이며, 파일을 읽기 모드로 엽니다. 다른 모드로는 'w'(쓰기), 'a'(추가), 'b'(바이너리), 't'(텍스트), '+'(읽기와 쓰기 모두 가능) 등이 있습니다. 이러한 모드는 조합하여 사용할 수 있습니다. 예를 들어, 'rb'는 바이너리 읽기 모드, 'w+'는 읽기와 쓰기 모드 등입니다.
  • buffering: 버퍼링 정책을 설정합니다. 기본값은 -1로 시스템 기본값이 사용됩니다.
  • encoding: 파일을 읽거나 쓸 때 사용할 인코딩을 설정합니다. 기본값은 None으로 시스템 기본 인코딩을 사용합니다.
  • errors: 인코딩 및 디코딩 오류 처리 방식을 설정합니다. 기본값은 None입니다.
  • newline: 개행 문자를 어떻게 처리할지 설정합니다. 기본값은 None입니다.

 

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

 


2. with 구문을 이용한 파일 입출력

 

with 구문을 사용한 파일 입출력은 파이썬에서 권장되는 방식입니다. with 구문을 이용하면, 파일 작업이 끝났을 때 자동으로 파일을 닫아줍니다. 이렇게 하면 파일을 명시적으로 닫아주는 close() 메서드를 호출할 필요가 없고, 예외가 발생할 경우에도 파일이 제대로 닫히는 것이 보장됩니다. 

 

아래 코드는 with 구문을 사용하지 않은 경우입니다.  코드에서는 open() 함수를 사용하여 파일을 열고, 작업을 수행한 후 close() 메서드를 호출하여 파일을 닫습니다. 이 경우, 예외가 발생하면 close() 메서드가 호출되지 않을 수 있습니다. 이로 인해 열린 파일이 남아있어 시스템 자원의 낭비가 발생할 수 있습니다.

file = open('example.txt', 'r', encoding='utf-8')
content = file.read()
print(content)
file.close()

 

아래 코드는 with 구문을 사용한 경우입니다. 

with open('example.txt', 'r', encoding='utf-8') as file:
    content = file.read()
    print(content)

 

 


3. open() 함수의 파일 열기 모드

 

파일 열기 모드는 open() 함수의 mode 매개변수를 통해 설정할 수 있으며, 이를 통해 파일을 읽고, 쓰고, 추가하는 등 다양한 목적으로 열 수 있습니다. 모드 문자는 조합하여 사용할 수 있습니다. 주요 파일 열기 모드는 다음과 같습니다.

 

  • 'r' (읽기 모드): 파일을 읽기 위한 모드로, 기본값입니다. 파일을 열 때 해당 파일이 존재하지 않으면 오류가 발생합니다.
  • 'w' (쓰기 모드): 파일을 쓰기 위한 모드입니다. 파일이 이미 존재하면 기존 내용을 삭제하고 새로 쓰기 시작합니다. 파일이 없으면 새 파일을 생성합니다.
  • 'a' (추가 모드): 파일의 끝에 내용을 추가하기 위한 모드입니다. 파일이 없으면 새 파일을 생성합니다.
  • 'x' (배타적 생성 모드): 새 파일을 생성하기 위한 모드입니다. 이미 파일이 존재할 경우 오류가 발생합니다.
  • 'b' (바이너리 모드): 파일을 바이너리 형식으로 엽니다. 텍스트 파일 이외의 파일(이미지, 동영상 등)을 처리할 때 사용됩니다.
  • 't' (텍스트 모드): 파일을 텍스트 형식으로 엽니다. 기본값입니다.
  • '+' (읽기와 쓰기 모드): 파일을 읽기와 쓰기를 동시에 수행할 수 있는 모드로 설정합니다. 이는 'r', 'w', 'a'와 같은 다른 모드와 함께 사용할 수 있습니다.


아래 코드는 읽기 모드, 쓰기 모드, 추가 모드, 바이너리 읽기 모드를 이용해 파일을 읽는 코드입니다.

# 읽기 모드로 파일 열기
with open('example.txt', 'r', encoding='utf-8') as file:
    content = file.read()

# 쓰기 모드로 파일 열기
with open('example.txt', 'w', encoding='utf-8') as file:
    file.write('Hello, World!')

# 추가 모드로 파일 열기
with open('example.txt', 'a', encoding='utf-8') as file:
    file.write('Append this text!')

# 바이너리 읽기 모드로 파일 열기
with open('example.jpg', 'rb') as file:
    content = file.read()

 


4. 연습문제

 

다음은 파일에서 데이터를 읽어와서 조건에 맞는 부분만 출력해주는 예제입니다. 이 예제에서는 텍스트 파일에서 나이를 기록한 데이터를 읽고, 나이가 30 이상인 사람들의 데이터만 출력하는 작업을 수행합니다.

 

파일 (ages.txt)

김철수, 25
이영희, 32
박민수, 29
최지영, 38
홍길동, 45

 

예제에서는 먼저 readlines() 메서드를 사용하여 파일의 내용을 리스트로 읽어옵니다. 그 다음, age_filter 함수를 정의하여 나이가 30 이상인지 확인하는 작업을 수행합니다. 마지막으로, filter() 함수를 사용하여 조건에 맞는 부분만 출력합니다. 

# 나이가 30 이상인 사람들의 데이터를 출력하는 함수
def age_filter(line):
    name, age = line.strip().split(', ')
    age = int(age)
    return age >= 30

# 파일에서 데이터를 읽어옵니다.
with open('ages.txt', 'r', encoding='utf-8') as file:
    content = file.readlines()

# 조건에 맞는 부분만 출력합니다.
filtered_content = filter(age_filter, content)
print("나이가 30 이상인 사람들:")
for line in filtered_content:
    print(line.strip())
    
    
#나이가 30 이상인 사람들:
#이영희, 32
#최지영, 38
#홍길동, 45