Python 파일 읽기 및 쓰기

PythonBeginner
지금 연습하기

소개

본 랩에서는 Python 에서 파일 읽기 및 쓰기의 기본 프로세스를 학습합니다. 파일 I/O(입력/출력) 는 프로그램이 데이터를 영구적으로 저장하고, 구성을 읽고, 파일 시스템과 상호 작용할 수 있게 해주므로 모든 프로그래머에게 필수적인 기술입니다.

본 랩에서는 Python 에서 파일을 처리하는 현대적이고 권장되는 방식인 with 문 사용에 중점을 둘 것입니다. with 문은 오류가 발생하더라도 파일이 자동으로 닫히도록 보장하여 리소스 누수를 방지합니다.

본 랩을 통해 다음을 수행하게 됩니다.

  • 기본적인 파일 I/O 프로세스를 이해합니다.
  • 다양한 메서드 (read(), readlines(), 반복) 를 사용하여 파일을 열고 읽습니다.
  • 파일에 새 내용을 쓰거나 기존 파일에 내용을 추가합니다.

모든 작업은 LabEx WebIDE 내에서 수행됩니다. 시작하겠습니다.

파일 읽기 및 쓰기 프로세스

이 단계에서는 Python 에서 파일 I/O 의 기본 프로세스와 with 문이 왜 필수적인지에 대해 배웁니다.

Python 에서 파일로부터 읽거나 파일에 쓰기 위해서는 일반적으로 다음 세 단계를 따릅니다.

  1. 파일 열기.
  2. 파일 읽기 또는 쓰기.
  3. 파일 닫기.

파일 닫기를 수동으로 관리하는 것은 오류가 발생하기 쉽습니다. 파일이 열려 있는 동안 프로그램에 오류가 발생하면 파일이 제대로 닫히지 않을 수 있습니다. 이를 해결하기 위해 Python 은 with 문을 제공합니다. with 문은 예외가 발생하더라도 파일 닫기를 자동으로 처리하여 시스템 리소스가 올바르게 관리되도록 보장합니다.

참고: WebIDE(VS Code 와 유사) 사용에 익숙하지 않다면, 이 랩에서 먼저 학습하십시오.

기본 구문은 다음과 같습니다.

with open('filename.txt', 'mode') as file_variable:
    ## 파일에 대한 작업 수행
  • open(): 파일을 여는 내장 함수입니다.
  • 'filename.txt': 파일의 경로입니다.
  • 'mode': 파일이 사용될 방식을 나타내는 문자입니다 (예: 읽기의 경우 'r', 쓰기의 경우 'w').
  • file_variable: 파일 객체와 상호 작용하는 데 사용할 변수입니다.

이 단계는 순전히 개념적인 내용입니다. 다음 단계에서는 이 지식을 실제 파일 작업을 수행하는 데 적용할 것입니다.

파일 열기 및 읽기

이 단계에서는 open() 함수를 사용하여 파일을 열고 읽는 방법을 학습합니다. 전체 파일을 읽는 방법, 파일을 줄 단위로 리스트에 읽어 들이는 방법, 그리고 대용량 파일에 매우 효율적인 줄 반복 (iteration) 방법을 다룰 것입니다.

설정 스크립트가 이미 두 개의 파일 (hi.txt와 sonnet29.txt) 을 생성했습니다.

read()를 사용하여 전체 파일 읽기

read() 메서드는 파일의 전체 내용을 단일 문자열로 읽습니다.

  1. 왼쪽 파일 탐색기에서 read_file.py 파일을 엽니다.
  2. 다음 코드를 파일에 추가합니다. 이 스크립트는 hi.txt를 열고, 내용을 읽고, 콘솔에 출력합니다.
## Read file using 'with' statement: automatically closes file when done
with open('/home/labex/project/hi.txt') as hello_file:
    hello_content = hello_file.read()  ## Read entire file content

print(hello_content)
  1. 스크립트를 실행하려면 터미널을 열고 다음 명령을 실행합니다.
python3 read_file.py

hi.txt의 내용이 출력되는 것을 볼 수 있습니다.

Hello World!

readlines()를 사용하여 파일 내용을 줄 목록으로 읽기

readlines() 메서드는 파일의 모든 줄을 읽어 문자열 리스트로 반환합니다. 리스트의 각 문자열은 한 줄을 나타내며 끝에 줄 바꿈 문자 (\n) 를 포함합니다.

  1. sonnet29.txt를 읽도록 read_file.py를 다음 코드로 수정합니다.
## readlines() method: returns list of strings, one per line
with open('/home/labex/project/sonnet29.txt') as sonnet_file:
    lines = sonnet_file.readlines()  ## Returns list with each line as a string

print(lines)
  1. 스크립트를 다시 실행합니다.
python3 read_file.py

출력 결과는 파일의 각 줄이 문자열로 포함된 리스트가 될 것입니다.

['When, in disgrace with fortune and men\'s eyes,\n', 'I all alone beweep my outcast state,\n', 'And trouble deaf heaven with my bootless cries,\n', 'And look upon myself and curse my fate,\n']

파일 내용을 줄 단위로 반복 처리하기

대용량 파일의 경우 전체 내용을 메모리로 읽어 들이는 것은 비효율적일 수 있습니다. 더 나은 방법은 파일 객체를 직접 반복 (iterate) 하는 것입니다. 이렇게 하면 파일 전체를 메모리에 로드하지 않고 줄 단위로 파일을 읽습니다.

  1. 다음 코드로 read_file.py를 마지막으로 수정합니다.
## Iterate through file line by line (memory efficient for large files)
with open('/home/labex/project/sonnet29.txt') as sonnet_file:
    for line in sonnet_file:  ## File object is iterable
        print(line, end='')  ## Print without extra newline

참고: 파일의 각 line에는 이미 줄 바꿈 문자가 포함되어 있으므로, 추가적인 줄 바꿈이 생기는 것을 방지하기 위해 print() 함수에서 end=''를 사용합니다.

  1. 스크립트를 실행합니다.
python3 read_file.py

이렇게 하면 파일 내용이 완벽하게 서식이 지정되어 출력됩니다.

When, in disgrace with fortune and men's eyes,
I all alone beweep my outcast state,
And trouble deaf heaven with my bootless cries,
And look upon myself and curse my fate,

파일에 쓰기

이 단계에서는 데이터 (data) 를 파일에 쓰는 방법을 탐구합니다. 기존 내용을 덮어쓰는 쓰기 모드 ('w') 와 파일 끝에 새 데이터를 추가하는 추가 모드 ('a') 의 두 가지 모드를 다룰 것입니다.

'w' 모드를 사용하여 파일에 쓰기

파일을 쓰기 모드 ('w') 로 열면, 파일이 존재하지 않으면 새 파일이 생성됩니다. 파일이 이미 존재하는 경우, 새 내용을 쓰기 전에 파일의 전체 내용이 지워집니다.

  1. 파일 탐색기에서 write_file.py 파일을 엽니다.
  2. 다음 코드를 추가합니다. 이 스크립트는 bacon.txt라는 파일을 생성하고 그 안에 한 줄의 텍스트를 씁니다. write() 메서드는 작성된 문자 수를 반환합니다.
## Write to file: 'w' mode overwrites existing file
with open('/home/labex/project/bacon.txt', 'w') as bacon_file:  ## 'w' = write mode
    chars_written = bacon_file.write('Hello world!\n')  ## Returns number of characters written

print(chars_written)
  1. 터미널에서 스크립트를 실행합니다.
python3 write_file.py

출력은 파일에 작성된 문자 수를 보여줍니다.

13

이제 파일 탐색기에서 새 파일인 bacon.txt를 확인할 수 있습니다.

'a' 모드를 사용하여 파일에 추가하기

추가 모드 ('a') 는 기존 파일의 내용을 삭제하지 않고 파일 끝에 데이터를 추가하는 데 사용됩니다. 파일이 존재하지 않으면 파일이 생성됩니다.

  1. bacon.txt에 한 줄을 더 추가하도록 write_file.py를 수정합니다.
## Append to file: 'a' mode appends to existing file
with open('/home/labex/project/bacon.txt', 'a') as bacon_file:  ## 'a' = append mode
    chars_written = bacon_file.write('Bacon is not a vegetable.')

print(chars_written)
  1. 스크립트를 다시 실행합니다.
python3 write_file.py

출력은 새 문자열의 문자 수를 보여줍니다.

25

최종 내용 확인

쓰기 및 추가 작업이 올바르게 작동했는지 확인하기 위해 bacon.txt의 내용을 읽어 보겠습니다.

  1. bacon.txt의 내용을 읽고 출력하도록 write_file.py를 마지막으로 수정합니다.
with open('/home/labex/project/bacon.txt') as bacon_file:
    content = bacon_file.read()

print(content)
  1. 스크립트를 실행합니다.
python3 write_file.py

출력 결과는 쓰기 작업과 추가 작업에서 결합된 내용을 보여야 합니다.

Hello world!
Bacon is not a vegetable.

요약

Python 에서 파일 읽기 및 쓰기에 대한 실습 (lab) 을 완료하신 것을 축하드립니다!

이 실습에서 여러분은 파일 I/O(입출력) 에 필수적인 기술들을 배웠습니다. 안전하고 자동적인 파일 처리를 위해 with 문의 중요성을 이해하는 것부터 시작했습니다.

그런 다음 파일을 읽는 여러 가지 방법을 연습했습니다.

  • 전체 내용을 단일 문자열로 얻기 위한 read().
  • 모든 줄의 리스트를 얻기 위한 readlines().
  • 대용량 파일을 줄 단위로 처리하기 위한 메모리 효율적인 방법으로 파일 객체를 직접 반복 처리하는 방법.

마지막으로, 파일에 쓰는 방법을 탐구했습니다.

  • 새 파일을 생성하거나 기존 파일을 덮어쓰기 위한 쓰기 모드 ('w') 사용.
  • 이전 데이터를 지우지 않고 파일 끝에 내용을 추가하기 위한 추가 모드 ('a') 사용.

이러한 기본적인 작업들은 데이터를 저장하거나, 설정을 읽거나, 텍스트 파일을 처리해야 하는 더 복잡한 애플리케이션을 위한 구성 요소 (building blocks) 가 됩니다.