소개
본 랩에서는 Python 에서 파일 읽기 및 쓰기의 기본 프로세스를 학습합니다. 파일 I/O(입력/출력) 는 프로그램이 데이터를 영구적으로 저장하고, 구성을 읽고, 파일 시스템과 상호 작용할 수 있게 해주므로 모든 프로그래머에게 필수적인 기술입니다.
본 랩에서는 Python 에서 파일을 처리하는 현대적이고 권장되는 방식인 with 문 사용에 중점을 둘 것입니다. with 문은 오류가 발생하더라도 파일이 자동으로 닫히도록 보장하여 리소스 누수를 방지합니다.
본 랩을 통해 다음을 수행하게 됩니다.
- 기본적인 파일 I/O 프로세스를 이해합니다.
- 다양한 메서드 (
read(),readlines(), 반복) 를 사용하여 파일을 열고 읽습니다. - 파일에 새 내용을 쓰거나 기존 파일에 내용을 추가합니다.
모든 작업은 LabEx WebIDE 내에서 수행됩니다. 시작하겠습니다.
파일 읽기 및 쓰기 프로세스
이 단계에서는 Python 에서 파일 I/O 의 기본 프로세스와 with 문이 왜 필수적인지에 대해 배웁니다.
Python 에서 파일로부터 읽거나 파일에 쓰기 위해서는 일반적으로 다음 세 단계를 따릅니다.
- 파일 열기.
- 파일 읽기 또는 쓰기.
- 파일 닫기.
파일 닫기를 수동으로 관리하는 것은 오류가 발생하기 쉽습니다. 파일이 열려 있는 동안 프로그램에 오류가 발생하면 파일이 제대로 닫히지 않을 수 있습니다. 이를 해결하기 위해 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() 메서드는 파일의 전체 내용을 단일 문자열로 읽습니다.
- 왼쪽 파일 탐색기에서
read_file.py파일을 엽니다. - 다음 코드를 파일에 추가합니다. 이 스크립트는
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)
- 스크립트를 실행하려면 터미널을 열고 다음 명령을 실행합니다.
python3 read_file.py
hi.txt의 내용이 출력되는 것을 볼 수 있습니다.
Hello World!
readlines()를 사용하여 파일 내용을 줄 목록으로 읽기
readlines() 메서드는 파일의 모든 줄을 읽어 문자열 리스트로 반환합니다. 리스트의 각 문자열은 한 줄을 나타내며 끝에 줄 바꿈 문자 (\n) 를 포함합니다.
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)
- 스크립트를 다시 실행합니다.
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) 하는 것입니다. 이렇게 하면 파일 전체를 메모리에 로드하지 않고 줄 단위로 파일을 읽습니다.
- 다음 코드로
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=''를 사용합니다.
- 스크립트를 실행합니다.
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') 로 열면, 파일이 존재하지 않으면 새 파일이 생성됩니다. 파일이 이미 존재하는 경우, 새 내용을 쓰기 전에 파일의 전체 내용이 지워집니다.
- 파일 탐색기에서
write_file.py파일을 엽니다. - 다음 코드를 추가합니다. 이 스크립트는
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)
- 터미널에서 스크립트를 실행합니다.
python3 write_file.py
출력은 파일에 작성된 문자 수를 보여줍니다.
13
이제 파일 탐색기에서 새 파일인 bacon.txt를 확인할 수 있습니다.
'a' 모드를 사용하여 파일에 추가하기
추가 모드 ('a') 는 기존 파일의 내용을 삭제하지 않고 파일 끝에 데이터를 추가하는 데 사용됩니다. 파일이 존재하지 않으면 파일이 생성됩니다.
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)
- 스크립트를 다시 실행합니다.
python3 write_file.py
출력은 새 문자열의 문자 수를 보여줍니다.
25
최종 내용 확인
쓰기 및 추가 작업이 올바르게 작동했는지 확인하기 위해 bacon.txt의 내용을 읽어 보겠습니다.
bacon.txt의 내용을 읽고 출력하도록write_file.py를 마지막으로 수정합니다.
with open('/home/labex/project/bacon.txt') as bacon_file:
content = bacon_file.read()
print(content)
- 스크립트를 실행합니다.
python3 write_file.py
출력 결과는 쓰기 작업과 추가 작업에서 결합된 내용을 보여야 합니다.
Hello world!
Bacon is not a vegetable.
요약
Python 에서 파일 읽기 및 쓰기에 대한 실습 (lab) 을 완료하신 것을 축하드립니다!
이 실습에서 여러분은 파일 I/O(입출력) 에 필수적인 기술들을 배웠습니다. 안전하고 자동적인 파일 처리를 위해 with 문의 중요성을 이해하는 것부터 시작했습니다.
그런 다음 파일을 읽는 여러 가지 방법을 연습했습니다.
- 전체 내용을 단일 문자열로 얻기 위한
read(). - 모든 줄의 리스트를 얻기 위한
readlines(). - 대용량 파일을 줄 단위로 처리하기 위한 메모리 효율적인 방법으로 파일 객체를 직접 반복 처리하는 방법.
마지막으로, 파일에 쓰는 방법을 탐구했습니다.
- 새 파일을 생성하거나 기존 파일을 덮어쓰기 위한 쓰기 모드 (
'w') 사용. - 이전 데이터를 지우지 않고 파일 끝에 내용을 추가하기 위한 추가 모드 (
'a') 사용.
이러한 기본적인 작업들은 데이터를 저장하거나, 설정을 읽거나, 텍스트 파일을 처리해야 하는 더 복잡한 애플리케이션을 위한 구성 요소 (building blocks) 가 됩니다.



