2강. QFile.open()과 QIODevice 플래그 이해하기

0. 학습 목표
→ QFile.open()에 들어가는 QIODevice 플래그의 의미와 조합 방식을 이해합니다.
이번 글에서 다룰 내용
이번 글에서는 QFile.open()에 들어가는 QIODevice큐아이오디바이스 플래그를 학습합니다.
1강에서는 QFile로 파일을 쓰고 읽는 가장 간단한 실습을 진행했습니다.
이번 2강에서는 파일을 열 때 사용하는 ReadOnly, WriteOnly, Append, Text의 차이를 직접 비교합니다.
| 구분 | 내용 |
| 핵심 개념 | QFile.open()은 파일을 실제로 여는 함수이고, QIODevice 플래그는 파일을 어떤 방식으로 열지 정합니다. |
| 실습 준비 | Python과 PySide6가 설치된 환경에서 콘솔 스크립트로 실습합니다. |
| 최종 목표 | WriteOnly, ReadOnly, Append, Text 플래그의 차이를 코드 실행 결과로 이해합니다. |
이번 단계의 핵심: QFile.open()의 플래그는 파일을 읽을지, 쓸지, 이어 쓸지, 텍스트로 다룰지를 정하는 스위치입니다.
1. open() 안의 옵션이 왜 필요할까?
→ 같은 파일이라도 읽기, 쓰기, 이어쓰기에 따라 여는 방식이 달라져야 합니다.
1.1 파일을 여는 방식은 하나가 아니다
파일을 다룰 때는 먼저 파일을 열어야 합니다.
그런데 파일을 열 때 항상 같은 방식으로 열지는 않습니다.
파일 내용을 읽고 싶을 때와 새 내용을 저장하고 싶을 때는 파일을 여는 목적이 다릅니다.
| 하고 싶은 일 | 필요한 열기 방식 |
| 파일 내용 읽기 | 읽기 모드로 열어야 합니다. |
| 파일에 새 내용 쓰기 | 쓰기 모드로 열어야 합니다. |
| 기존 내용 뒤에 추가하기 | 이어쓰기 모드로 열어야 합니다. |
| 텍스트 파일로 다루기 | 텍스트 모드를 함께 사용합니다. |
1.2 QFile.open() 기본 형태
QFile에서 파일을 실제로 여는 코드는 open()입니다.
open() 안에는 파일을 어떤 방식으로 열지 정하는 플래그를 넣습니다.
file = QFile("sample.txt")
file.open(QIODevice.OpenModeFlag.WriteOnly | QIODevice.OpenModeFlag.Text)
위 코드는 sample.txt 파일을 쓰기 모드와 텍스트 모드로 여는 예시입니다.
여기서 | 기호는 여러 플래그를 함께 사용하겠다는 의미입니다.
| 코드 | 의미 |
| QFile("sample.txt") | sample.txt 파일을 다루기 위한 QFile 객체를 만듭니다. |
| open() | 파일에 실제로 접근하기 시작합니다. |
| WriteOnly | 파일을 쓰기 전용으로 엽니다. |
| Text | 파일을 텍스트 파일처럼 다룹니다. |
| | | 여러 플래그를 함께 조합합니다. |
문제의 핵심: QFile 객체를 만들었다고 파일이 열린 것은 아닙니다. 실제 파일 접근은 open()을 호출할 때 시작됩니다.
2. ReadOnly, WriteOnly, Append를 직접 비교하기
→ 파일을 읽기, 쓰기, 이어쓰기 모드로 열었을 때 결과가 어떻게 달라지는지 확인합니다.
2.1 WriteOnly로 새 내용 저장하기
먼저 WriteOnly 모드로 파일을 열고 내용을 저장합니다.
아래 코드를 write_only_demo.py로 저장하고 실행합니다.
# write_only_demo.py
from PySide6.QtCore import QFile, QIODevice, QTextStream
file = QFile("mode_test.txt")
if file.open(QIODevice.OpenModeFlag.WriteOnly | QIODevice.OpenModeFlag.Text):
stream = QTextStream(file)
stream << "WriteOnly로 저장한 첫 번째 줄입니다.\\n"
stream << "기존 내용은 사라질 수 있습니다."
file.close()
print("WriteOnly 저장 완료!")
else:
print("파일을 열 수 없습니다.")
print(file.errorString())
실행하면 현재 폴더에 mode_test.txt 파일이 만들어집니다.
파일 안에는 아래와 같은 내용이 저장됩니다.
WriteOnly로 저장한 첫 번째 줄입니다.
기존 내용은 사라질 수 있습니다.
WriteOnly는 파일에 새 내용을 쓸 때 사용합니다.
같은 파일에 다시 WriteOnly로 쓰면 기존 내용이 덮어써질 수 있으므로 주의해야 합니다.
2.2 Append로 기존 내용 뒤에 추가하기
이번에는 Append 모드로 같은 파일을 엽니다.
Append는 기존 내용을 지우지 않고 파일 끝에 새 내용을 추가합니다.
# append_demo.py
from PySide6.QtCore import QFile, QIODevice, QTextStream
file = QFile("mode_test.txt")
if file.open(QIODevice.OpenModeFlag.Append | QIODevice.OpenModeFlag.Text):
stream = QTextStream(file)
stream << "\\nAppend로 추가한 줄입니다."
file.close()
print("Append 추가 완료!")
else:
print("파일을 열 수 없습니다.")
print(file.errorString())
실행 후 mode_test.txt 파일을 확인하면 기존 내용 뒤에 한 줄이 추가됩니다.
WriteOnly로 저장한 첫 번째 줄입니다.
기존 내용은 사라질 수 있습니다.
Append로 추가한 줄입니다.
WriteOnly는 새로 쓰는 느낌이고, Append는 뒤에 붙이는 느낌입니다.
2.3 ReadOnly로 파일 내용 읽기
마지막으로 ReadOnly 모드로 파일을 읽어 봅니다.
파일 내용을 바꾸지 않고 읽기만 할 때 사용합니다.
# read_only_demo.py
from PySide6.QtCore import QFile, QIODevice, QTextStream
file = QFile("mode_test.txt")
if file.open(QIODevice.OpenModeFlag.ReadOnly | QIODevice.OpenModeFlag.Text):
stream = QTextStream(file)
content = stream.readAll()
file.close()
print("파일 내용:")
print(content)
else:
print("파일을 읽기 모드로 열 수 없습니다.")
print(file.errorString())
실행하면 mode_test.txt 파일의 전체 내용이 콘솔에 출력됩니다.
파일 내용:
WriteOnly로 저장한 첫 번째 줄입니다.
기존 내용은 사라질 수 있습니다.
Append로 추가한 줄입니다.
핵심 확인: WriteOnly는 새로 쓰기, Append는 뒤에 추가하기, ReadOnly는 읽기 전용입니다.
3. QIODevice 플래그 조합 자세히 살펴보기
→ open()에 들어가는 플래그가 어떤 역할을 하는지 표와 흐름으로 정리합니다.
3.1 자주 쓰는 플래그 정리
QIODevice 플래그는 파일을 어떤 상태로 열지 정합니다.
처음에는 아래 4개만 먼저 기억하면 됩니다.
| 플래그 | 의미 |
| ReadOnly | 파일을 읽기 전용으로 엽니다. |
| WriteOnly | 파일을 쓰기 전용으로 엽니다. QFile에서는 기존 내용이 사라질 수 있으므로 주의합니다. |
| Append | 파일 끝에 내용을 이어 씁니다. |
| Text | 텍스트 파일 모드로 엽니다. |
나중에 조금 더 익숙해지면 ReadWrite도 사용할 수 있습니다.
| 추가 플래그 | 의미 |
| ReadWrite | 읽기와 쓰기를 모두 할 수 있게 엽니다. |
| Truncate | 파일을 열 때 기존 내용을 비웁니다. |
| NotOpen | 파일이 열려 있지 않은 상태를 의미합니다. |
3.2 플래그를 조합하는 이유
파일을 열 때는 보통 하나의 플래그만 쓰지 않습니다.
예를 들어 텍스트 파일을 쓰려면 쓰기 모드와 텍스트 모드를 함께 사용합니다.
QIODevice.OpenModeFlag.WriteOnly | QIODevice.OpenModeFlag.Text
텍스트 파일을 읽을 때는 읽기 모드와 텍스트 모드를 함께 사용합니다.
QIODevice.OpenModeFlag.ReadOnly | QIODevice.OpenModeFlag.Text
기존 내용 뒤에 텍스트를 추가할 때는 Append와 Text를 함께 사용합니다.
QIODevice.OpenModeFlag.Append | QIODevice.OpenModeFlag.Text
이처럼 | 기호는 여러 설정을 동시에 켜는 역할을 합니다.
3.3 실행 흐름으로 이해하기
QFile.open()은 아래 흐름으로 이해하면 쉽습니다.
QFile 객체 생성
↓
open() 호출
↓
플래그 확인
↓
읽기 모드인지, 쓰기 모드인지 결정
↓
텍스트 모드 여부 확인
↓
파일 작업 시작
즉, open()은 단순히 파일을 여는 코드가 아닙니다.
파일을 어떤 규칙으로 사용할지 정하는 출발점입니다.
| 코드 | 역할 |
| file.open(...) | 파일에 실제로 접근합니다. |
| ReadOnly | 읽기만 허용합니다. |
| WriteOnly | 쓰기만 허용합니다. |
| Append | 파일 끝에 이어 쓰도록 합니다. |
| Text | 텍스트 파일 처리에 맞게 다룹니다. |
주의할 점: WriteOnly와 Append는 모두 파일에 쓰는 모드이지만, WriteOnly는 새로 쓰는 방식이고 Append는 기존 내용 뒤에 추가하는 방식입니다.
4. Python open() 모드와 QIODevice 비교하며 정리하기
→ Python의 r, w, a 모드와 QIODevice 플래그를 비교하며 핵심을 정리합니다.
4.1 Python open() 모드와 비교
Python 내장 open() 함수에도 파일 모드가 있습니다.
QIODevice 플래그는 Python의 파일 모드와 비슷하게 이해할 수 있습니다.
| 하고 싶은 일 | Python open() | QFile + QIODevice |
| 읽기 | "r" | QIODevice.OpenModeFlag.ReadOnly | QIODevice.OpenModeFlag.Text |
| 쓰기 | "w" | QIODevice.OpenModeFlag.WriteOnly | QIODevice.OpenModeFlag.Text |
| 이어쓰기 | "a" | QIODevice.OpenModeFlag.Append | QIODevice.OpenModeFlag.Text |
| 읽기 + 쓰기 | "r+" | QIODevice.OpenModeFlag.ReadWrite | QIODevice.OpenModeFlag.Text |
처음에는 Python open()의 r, w, a와 연결해서 기억하면 쉽습니다.
다만 Qt에서는 GUI, 리소스 파일, QTextStream 같은 Qt 기능과 연결하기 위해 QFile과 QIODevice를 사용합니다.
4.2 최종 정리
이번 글에서는 QFile.open()에 들어가는 QIODevice 플래그를 직접 비교했습니다.
| 핵심 내용 | 정리 |
| 문제 파악 | 파일을 읽을 때와 쓸 때는 서로 다른 방식으로 열어야 한다는 것을 확인했습니다. |
| 문제 해결 | WriteOnly, Append, ReadOnly를 직접 실행하며 결과 차이를 확인했습니다. |
| 코드 분석 | open() 안의 플래그가 파일 사용 규칙을 정한다는 것을 살펴봤습니다. |
| 비교 정리 | Python open()의 r, w, a 모드와 QIODevice 플래그를 비교했습니다. |
기억할 문장: QFile.open()의 플래그는 파일을 읽을지, 새로 쓸지, 뒤에 이어 쓸지를 결정하는 설정입니다.
참고. 공식 문서로 확인하기
→ QFile.open()과 QIODevice 플래그의 자세한 내용은 공식 문서에서 확인합니다.
참고 문서
이번 글에서 사용한 QFile, QIODevice, QTextStream은 PySide6의 QtCore 모듈에 포함되어 있습니다.
- PySide6 QFile 공식 문서
- PySide6 QIODevice 공식 문서
- PySide6 QIODeviceBase OpenModeFlag 공식 문서
- PySide6 QTextStream 공식 문서
참고: 다음 강의에서는 QTextStream을 더 자세히 다루며, 문자열 쓰기, 전체 읽기, 줄 단위 읽기 흐름을 정리합니다.