在前面的系列文章中,我们已经大量接触到文章操作,比如打开读取一个图像文件,保存图像文件,编辑文本文件等等。在本文将详细介绍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 sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt, QFile, QTextStream, QIODevice, QByteArray
from 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 << self.txtEditor.toPlainText()
f.close()
def onFileSaveAs(self):
path,_ = QFileDialog.getSaveFileName(self, '保存文件', '', '文本文件 (*.txt)')
if not path:
return
self._saveToPath(path)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = DemoFile()
window.show()
sys.exit(app.exec())
运行结果如下图:
测试QFile
本文知识点
- QFile是用于读取和写入文本及二进制文件的I/O设备。
- QFile和QTextStream结合使用打开和保存文本文件。