8.4 QFile - Step 1
728x90

1. 학습 목표
더보기
학습 로드맵:
- ✅ Step 1 QFile.open() & QIODevice 플래그 이해하기
- Step 2 콘솔에서 QFile 맛보기 (순수 Python 스크립트)
- Step 3 PySide6 GUI 프로젝트 만들기 & 기본 창 띄우기
- Step 4 GUI에서 “파일 쓰기/읽기” 버튼 구현
- Step 5 파일 복사 기능까지 확장
이 단계에서 목표는:
- QFile.open() 이 어떤 역할을 하는지 이해
- 왜 그냥 open() 대신 QFile 을 사용하는지 감 잡기
- QFile.open() 사용할 때, QIODevice 플래그의 의미와 조합 방식 이해
- 각 플래그 조합이 Python 내장 open() 의 어떤 모드와 대응되는지 알기
- Qt 기반 GUI 프로그램에서 QFile 이 왜 더 적합한지 이해
2. QFile 을 사용하는 하는 이유
더보기
QFile 은 단순한 “파일 객체”가 아니라,
Qt 의 전체 I/O 시스템과 연동되는 QIODevice 기반 클래스입니다.
- 1) QFileDialog 와 자연스럽게 연결됨
파일 선택 → QFileDialog → QFile → QTextStream
이라고 이어지는 Qt 기반 파일 처리 흐름이 존재합니다. - 2) QTextStream 사용 가능
텍스트 인코딩 및 줄 단위 입출력이 훨씬 쉽습니다. - 3) 이벤트 루프와 연동
Qt의 비동기 처리, 리소스 관리 등과 자연스럽게 작동합니다. - 4) OS 간 차이를 Qt가 알아서 보정
개행(\n) 처리 등 플랫폼마다 다른 부분을 Qt가 자동 처리합니다.
3. QFile 사용법
더보기
1. 아래와 같이 QFile을 사용하는 방법을 살펴봅니다.
file = QFile("파일경로")
file.open(플래그 | 플래그)
stream = QTextStream(file)
2. file = QFile("파일경로")
# QFile 클래스로 파일 객체(파일 핸들 = 파일을 다룰 ‘도구’)를 생성한다.
file = QFile("파일경로")
- 단지 “이 경로를 가지는 파일을 조작할 객체”만 생성한 상태
파일을 '여는 것(open)'이 아니라, '파일을 조작할 준비' 정도로 이해하면 된다. - 파일에 접근하지 않았기에, 존재하는지 확인하지 않음
3. file.open(플래그 | 플래그)
file.open(QIODevice.ReadOnly | QIODevice.Text)
- 파일을 쓰기(Write Only) + 텍스트 모드(Text)로 연다.
- open() 호출 시 실제 파일 접근이 이루어진다.
- 자주 쓰는 플래그 목록
| 플래그 | 의미 |
| QIODevice.ReadOnly | 읽기 전용으로 열기 |
| QIODevice.WriteOnly | 쓰기 전용 (기존 내용 덮어씀) |
| QIODevice.Append | 파일 끝에 이어쓰기 ("a" 모드) |
| QIODevice.ReadWrite | 읽기 + 쓰기 |
| QIODevice.Text | 텍스트 모드 (개행 처리 OS 맞춤 변환) |
| QIODevice.Unbuffered | 버퍼링 없이 즉시 쓰기 (거의 안 씀) |
4. stream 사용 이유
stream = QTextStream(file)
QFile → 파일을 열고 닫는 입구 역할
QTextStream → 텍스트를 편하게 읽고 쓰는 통로 역할
문제 파악 - 스트림을 사용하지 않는 경우(불편한 방식)
# 파일 열기 자체는 다음처럼 가능하지만
# 문자열 쓰려면 반드시 바이트로 변환 해야 하고, 개행 처리도 직접 해야 해서 꽤 불편합니다.
file = QFile("sample.txt")
# QIODevice.WriteOnly → 쓰기 전용, Text 플래그 없음
if file.open(QIODevice.WriteOnly):
# 문자열을 쓰려면 반드시 bytes 로 변환해야 한다.
file.write("첫 번째 줄입니다.\n".encode("utf-8"))
QTextStream은 텍스트 파일을 다룰 수 있는 고급 도구로 위 불편한 방식과 비교합니다.
file = QFile("sample.txt")
if file.open(QIODevice.WriteOnly | QIODevice.Text):
stream = QTextStream(file)
# 자동 UTF-8 변환 + 자동 개행 처리
stream << "첫 번째 줄입니다.\n"
- 문자열을 바로 넣을 수 있음
- 자동 인코딩 처리
- 개행 문자 자동 관리
- readLine(), readAll() 같은 편리한 메서드 제공
즉, 파일 처리 난이도를 획기적으로 줄이는 도구입니다.
3. 실습 - 쓰기 모드
더보기


from PySide6.QtCore import QFile, QIODevice, QTextStream
file = QFile("sample.txt")
if file.open(QIODevice.WriteOnly | QIODevice.Text):
stream = QTextStream(file)
stream << "첫 번째 줄입니다.\n"
stream << "두 번째 줄입니다."
file.close()
print("파일 쓰기 완료!")
else:
print("파일을 열 수 없습니다.")
- QIODevice.WriteOnly → 쓰기 모드
- QIODevice.Text → 텍스트 전용 스트림
- QTextStream 으로 간단하게 텍스트 출력 가능
4. 실습 - 읽기 모드
더보기


file = QFile("sample.txt")
if file.open(QIODevice.ReadOnly | QIODevice.Text):
stream = QTextStream(file)
content = stream.readAll()
print("파일 내용:")
print(content)
file.close()
else:
print("파일을 읽기 모드로 열 수 없습니다.")
- WriteOnly → ReadOnly 로 변경
- stream.readAll() 로 전체 내용을 한 번에 읽기 가능
5. 실습 - Append 모드
더보기


file = QFile("sample.txt")
if file.open(QIODevice.Append | QIODevice.Text):
stream = QTextStream(file)
stream << "\n새로운 줄 추가!"
file.close()
print("Append(이어쓰기) 완료!")
- 이미 있는 파일 맨 끝에 새로운 내용이 추가됩니다.