实战PyQt5: 126-使用QFile进行文件操作

在前面的系列文章中,我们已经大量接触到文章操作,比如打开读取一个图像文件,保存图像文件,编辑文本文件等等。在本文将详细介绍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())   

运行结果如下图:

实战PyQt5: 126-使用QFile进行文件操作

测试QFile

本文知识点

  • QFile是用于读取和写入文本及二进制文件的I/O设备。
  • QFile和QTextStream结合使用打开和保存文本文件。

前一篇: 实战PyQt5: 125-使用配置文件来保存和恢复应用的设置

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值