
在前面的系列文章中,我們已經大量接觸到文章操作,比如打開讀取一個圖像檔案,儲存圖像檔案,編輯文本檔案等等。在本文将詳細介紹Qt中的檔案操作接口類QFile來處理檔案的I/O操作。
QFile簡介
QFile類提供用于讀取和寫入檔案的接口。QFile是用于讀取和寫入文本及二進制檔案的I/O裝置。QFile可以單獨使用,也可以和QTextStream或QDataStream一起使用。
在建立QFile對象的時候,就可以指定檔案名,也可以在建立對象後随時使用setFileName()函數進行設定。不管作業系統是什麼,QFile中的檔案分隔符均為'/'。QFile不支援使用其他分隔符(例如: '')。
下面的示例示範了使用QFile逐行讀取文本檔案:
file = QFile('in.txt')if not file.open(QIODevice.ReadOnly | QIODevice.Text): return while not file.atEnd(): line = QByteArray(file.readLine()) process_line(line)
QIODevice.Text标志告訴Qt将Windows樣式的行終止符(“ r n”)轉換為C ++樣式的終止符(“ n”)。在預設情況下,QFile假定為二進制,它不對檔案中存儲的位元組執行任何轉換。
下面的示例示範使用QTextStream來逐行讀取文本檔案。
file = QFile('in.txt')if not file.open(QIODevice.ReadOnly | QIODevice.Text): return in = QTextStream(file)while not in.atEnd(): line = in.readLine() process_line(line)
QFile的常用函數:
- open(self, ...):打開一個檔案裝置。
- copy(self, newName):将目前由fileName()指定的檔案複制到newName的檔案中。
- rename(self, newName):将目前由fileName()指定的檔案重命名為newName。
- rename(oldname, newName):靜态函數,将檔案oldName重命名為newName。
- setFileName(self, str):設定檔案名。
- fileName(self):傳回由setFileName()或建立QFile()時設定的檔案名稱。
- close(self):關閉檔案裝置。
測試
測試代碼示範使用QFile和QTextStream來加載和儲存文本檔案, 完整代碼如下:
import sysfrom PyQt5 import QtCore, QtGui, QtWidgetsfrom PyQt5.QtCore import Qt, QFile, QTextStream, QIODevice, QByteArrayfrom PyQt5.QtWidgets import (QApplication, QMainWindow, QMessageBox, QMenuBar, QMenu, QAction, QFileDialog, QPlainTextEdit) class DemoFile(QMainWindow): def __init__(self, parent=None): super(DemoFile, self).__init__(parent) # 設定視窗标題 self.setWindowTitle('實戰Qt for Python: QFile示範') # 設定視窗大小 self.resize(480, 360) self.initUi() def initUi(self): self.initMenuBar() self.txtEditor = QPlainTextEdit() self.setCentralWidget(self.txtEditor) def initMenuBar(self): menuBar = self.menuBar() menuFile = menuBar.addMenu('檔案(&F)') #打開檔案 actionFileOpen = QAction('打開(&O)...', self) actionFileOpen.setShortcut(Qt.CTRL + Qt.Key_O) actionFileOpen.setToolTip('打開一個文本檔案') actionFileOpen.triggered.connect(self.onFileOpen) #儲存 actionFileSave = QAction('儲存(&S)', self) actionFileSave.setShortcut(Qt.CTRL + Qt.Key_S) actionFileSave.setToolTip('儲存文本檔案') actionFileSave.triggered.connect(self.onFileSave) actionFileSaveAs = QAction('另存為(&A)...', self) actionFileSaveAs.triggered.connect(self.onFileSaveAs) actionExit = QAction('退出(&X)', self) actionExit.triggered.connect(QApplication.instance().quit) menuFile.addAction(actionFileOpen) menuFile.addAction(actionFileSave) menuFile.addAction(actionFileSaveAs) menuFile.addSeparator() menuFile.addAction(actionExit) def msgCritical(self, strInfo): dlg = QMessageBox(self) dlg.setIcon(QMessageBox.Critical) dlg.setText(strInfo) dlg.show() def onFileOpen(self): path,_ = QFileDialog.getOpenFileName(self, '打開檔案', '', '文本檔案 (*.txt)') if path: f = QFile(path) if not f.open(QIODevice.ReadOnly | QIODevice.Text): self.msgCritical('打開檔案失敗') return False self.path = path self.txtEditor.setPlainText(QTextStream(f).readAll()) f.close() #關閉檔案 def onFileSave(self): if self.path is None: return self.onFileSaveAs() self._saveToPath(self.path) def _saveToPath(self, path): f = QFile(path) if not f.open(QIODevice.WriteOnly): self.msgCritical('打開檔案失敗') return False self.path = path outText = QTextStream(f) outText <
運作結果如下圖:
測試QFile
本文知識點
- QFile是用于讀取和寫入文本及二進制檔案的I/O裝置。
- QFile和QTextStream結合使用打開和儲存文本檔案。
前一篇: 實戰PyQt5: 125-使用配置檔案來儲存和恢複應用的設定