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 모듈에 포함되어 있습니다.

참고: 다음 강의에서는 QTextStream을 더 자세히 다루며, 문자열 쓰기, 전체 읽기, 줄 단위 읽기 흐름을 정리합니다.