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(이어쓰기) 완료!")
  • 이미 있는 파일 맨 끝에 새로운 내용이 추가됩니다.