• pyqt5_实例:修改xml文件中节点值


    需求:

    将类似如下xml文件的externalid节点值修改成不重复的值

    实现该功能的代码Func.py:

     1 #coding=utf-8
     2 '''
     3 Created on 2019年10月15日
     4 
     5 @author: yanerfree
     6 
     7 '''
     8 import re
     9 import sys
    10 
    11 '''********************************************************
    12     Func Name:    modifyData
    13     Para:         path     :  xml文件路径
    14                   num      :  起始值从num开始,依次递增1
    15                   savepath :  修改后的文件保存路径
    16     return:       
    17     Desc:         修改xml中<externalid>节点中的值,使其每一条都不同
    18     Date:         20191015
    19     Auth:         yanerfree
    20 ********************************************************'''
    21 def modifyData(path, num, savepath):
    22     num_externalid = int(num)
    23     f1 = open(path,'r', encoding='utf-8')
    24     line = f1.readline()
    25     #[在re中有特殊含义,需要转义
    26     pattern = re.compile(r's*<externalid><![CDATA[d+]]></externalid>')
    27     
    28     f2 = open(savepath, 'w', encoding='utf-8')
    29     
    30     while line:
    31         #print('num_externalid:',num_externalid)
    32         m = re.match(pattern, line, flags=0)#没匹配到返回None
    33         #print(m)
    34         if m:
    35             print('替换<externalid>')
    36        
    37             line = re.sub('d+', str(num_externalid), line)
    38             #line = '       <externalid><![CDATA[%d]]></externalid>
    '%num
    39             num_externalid += 1
    40 
    41         print(line)
    42         f2.write(line)
    43         line = f1.readline()
    44         
    45     f1.close()
    46     f2.close()   
    47     
    48 def testMatch():
    49     pattern = re.compile(r's*<externalid><![CDATA[d+]]></externalid>')
    50     s1 = '<externalid><![CDATA[1110]]></externalid>'
    51     p1 = '<externalid><![CDATA'#[在re中有特殊含义,需要转义
    52     s2 = 'aasffdafaaa'
    53     p2 = 'a'
    54     m = re.match(pattern, s1, flags=0)#没匹配到返回None
    55     print(m)
    56     print(m.group(0))
    57     
    58     
    59 def testFindAll():
    60     s1='2019-09-16 01:18:58 INFO  [nioEventLoopGroup-3-7] [SimpleServerHandler.java:45] - client id:1568567938696,client request ip:183.195.12.193,content:SN=56636200000679;MODE=1;TIME=2019-9-16 1:19:1;LOC=0-460,0,6350,53537,40,16,0,0-460,0,6350,53537,40,16,0,0-460,0,6350,53537,40,16,0,0;TEST_NUM=4091;LOC_ERR=410;CONN_ERR=3400;SEND_ERR=0;REC_ERR=0'
    61     pattern = re.compile('content:SN=(.*?);MODE=(.*?);TIME=(.*?) .*?LOC=(.*?);TEST_NUM=(.*?);LOC_ERR=(.*?);CONN_ERR=(.*?);SEND_ERR=(.*?);REC_ERR=(d*)' )
    62     res = re.findall(pattern, s1)
    63     print(res) 
    64     
    65     '''
    66     运行结果:
    67     [('56636200000679', '1', '2019-9-16', '0-460,0,6350,53537,40,16,0,0-460,0,6350,53537,40,16,0,0-460,0,6350,53537,40,16,0,0', '4091', '410', '3400', '0', '0')]
    68     '''
    69 def testresub():
    70     num=9009
    71     line = '      <externalid><![CDATA[1]]></externalid>'
    72     line = re.sub('d+', str(num), line)
    73     print(line)
    74      
    75 if __name__ == '__main__':
    76     #'''
    77     fp = './test001.xml'
    78     sp = './output001.xml'    
    79     num = 10
    80     modifyData(fp, num ,sp)
    81     #'''
    82     #testMatch()
    83     #testFindAll()
    84     #testresub()
    85     
    86     
    87     

    以上代码单纯实现了需要的功能,但是如果需要给大家使用,不可能让所有人都安装python3环境,并且还安装需要的包,

    所以将其进一步开发并打包成exe可执行文件

    实现代码 modifyXmldata.py:

      1 #coding=utf-8
      2 '''
      3 Created on 2019年10月15日
      4 
      5 @author: yanerfree
      6 '''
      7 from PyQt5.QtGui import *
      8 from PyQt5.QtWidgets import *
      9 from PyQt5.QtCore import *
     10 import sys
     11 import os
     12 import time
     13 
     14 from Func import *
     15 
     16 class windowtool(QMainWindow):
     17     def __init__(self):
     18         super().__init__()
     19         self.setupUi()
     20         
     21     def setupUi(self):
     22         self.setWindowTitle("MyTool - modify externalid")#设置窗体标题
     23         self.resize(600,500)#设置窗体大小
     24         self.setFixedWidth(600)#固定窗体宽度
     25         #self.setFixedSize(600,500)#固定窗体大小
     26         self.createMenu()#菜单
     27         self.createWidget()#创建组件Widget
     28         self.createStatusBar()#创建状态栏    
     29     
     30     def createMenu(self):
     31         menubar = self.menuBar()##实例化主窗口的QMenuBar对象
     32         #向菜单栏中添加新的QMenu对象,父菜单
     33         menu_file = menubar.addMenu("File")
     34         menu_file.addAction(QAction("Exit",self,triggered=qApp.quit))
     35         
     36         menu_Help = menubar.addMenu("Help")
     37         menu_Help.addAction(QAction("About",self,triggered=self.about))
     38         
     39     def createWidget(self):
     40         #全局控件(注意参数self),用于承载全局布局
     41         self.wwidget = QWidget(self)
     42         self.wwidget.move(20,40)
     43         self.wwidget.resize(500,400)
     44         #全局布局(注意参数wwidget)
     45         self.wholelayout = QVBoxLayout(self.wwidget)
     46         
     47         #局部布局-网格布局
     48         glayout = QGridLayout()
     49         glayout.setSpacing(10)
     50         ###*******************************************###
     51         label1 = QLabel('选择需要处理的文件(xml):')
     52         button1 = QPushButton("选择文件")
     53         button1.clicked.connect(self.selectxmlfile)
     54         
     55         self.label_filepath = QLabel()
     56         self.label_filepath.setFrameStyle(QFrame.Panel|QFrame.Sunken)
     57         
     58         label3 = QLabel('选择文件处理后存放位置:')
     59         button2 = QPushButton("选择路径")
     60         button2.clicked.connect(self.choosedir)
     61         
     62         self.label_savepath = QLabel()
     63         self.label_savepath.setFrameStyle(QFrame.Panel|QFrame.Sunken)
     64         
     65         label5 = QLabel('设置 <externalid> 起始值 (整数):')
     66         self.linedit_num = QLineEdit()
     67         
     68         button_clear = QPushButton("Clear")
     69         button_clear.clicked.connect(self.clean_textedit)
     70         self.textedit_info = QTextEdit()
     71         
     72         startbutton = QPushButton("Start")
     73         startbutton.clicked.connect(self.start)
     74 
     75         glayout.addWidget(label1,1,1,1,2)#(1,1)一行一列
     76         glayout.addWidget(button1,2,1,1,1)
     77         glayout.addWidget(self.label_filepath,2,2,1,7)
     78         glayout.addWidget(label3,3,1,1,2)
     79         glayout.addWidget(button2,4,1,1,1)
     80         glayout.addWidget(self.label_savepath,4,2,1,7)
     81         glayout.addWidget(label5,5,1,1,2)
     82         glayout.addWidget(self.linedit_num,5,3,1,2)
     83         glayout.addWidget(startbutton,6,1,1,1)
     84         glayout.addWidget(button_clear,7,8)
     85         glayout.addWidget(self.textedit_info,8,1,8,8)
     86         ###*******************************************###
     87         
     88 
     89         self.wholelayout.addLayout(glayout)
     90         
     91     def createStatusBar(self):
     92         #实例化状态栏
     93         self.statusBar=QStatusBar()
     94         self.statusBar.showMessage("This is status info",4000)
     95         
     96         #设置状态栏,类似布局设置
     97         self.setStatusBar(self.statusBar) 
     98 
     99     def selectxmlfile(self):
    100         fileName,fileType = QFileDialog.getOpenFileName(self,
    101                                                     "Choose xml file",
    102                                                     r"C:\",
    103                                                     "Text Files (*.xml);;Text Files (*.txt);;")#设置文件扩展名过滤
    104  
    105         fileName = fileName.replace('/','\')#windows下需要进行文件分隔符转换
    106         print(fileName)
    107         self.label_filepath.setText(fileName)
    108         self.label_savepath.setText('')
    109         #return(fileName)
    110     
    111     def choosedir(self):
    112         filed,filen = os.path.split(self.label_filepath.text())
    113         savedir = QFileDialog.getExistingDirectory(self,"choose directory to save file",filed)
    114         #print(savedir)
    115         if not os.path.exists(savedir):
    116             return
    117         savedir = savedir.replace('/','\')#windows下需要进行文件分隔符转换
    118         filen = time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))+'_'+ filen
    119         savedir = os.path.join(savedir, filen)
    120         self.label_savepath.setText(savedir)
    121         #print(savedir)        
    122         
    123     def start(self):
    124         num = self.linedit_num.text()
    125         fp = self.label_filepath.text()
    126         sp = self.label_savepath.text()
    127         text = '-'*20+'
    '
    128         text += '文件处理完成'+'
    '
    129         text += '处理后文件:'+'
    '
    130         text += sp+'
    '
    131         if num and fp and sp:
    132             modifyData(fp, num, sp)
    133             #print(self.textedit_info.toPlainText())
    134             self.textedit_info.setText(text+self.textedit_info.toPlainText())
    135             
    136         else:
    137             QMessageBox.warning(self,"Warring","请确认设置项是否全部设置完成",QMessageBox.Yes|QMessageBox.No,QMessageBox.Yes)
    138     
    139     def about(self):
    140         pass
    141     
    142     def clean_textedit(self):
    143         self.textedit_info.clear()
    144         
    145 
    146         
    147 if __name__ == '__main__':
    148     # 每一个pyqt程序中都需要有一个QApplication对象,sys.argv是一个命令行参数列表
    149     app = QApplication(sys.argv)
    150     #实例化窗口
    151     demo = windowtool()
    152     #显示
    153     demo.show()
    154     #进入程序的主循环,遇到退出情况,终止程序
    155     sys.exit(app.exec_())     
    156     
    157     
    158     
    159     
    160     

    最后将其打包成exe可执行文件:

    需要安装PyInstaller,如未安装,可直接用pip安装即可

    命令:pip install PyInstaller

    使用pyinstaller打包

    打开cmd窗口,把路径切换到文件所在路径,输入以下内容(最后的是文件名):

    pyinstaller -F modifyXmldata.py

    或者直接全路径打包,不需要在cmd中将路径切换到脚本所在路径:

    pyinstaller -F  F: estmodifyXmldata.py

    另,打包时可以添加参数:

    pyinstaller -F F: estmodifyXmldata.py

    pyinstaller -F -w F: estmodifyXmldata.py

      

     参数含义

    -F 表示生成单个可执行文件

    -w 表示去掉控制台窗口,这在GUI界面时非常有用。不过如果是命令行程序的话那就把这个选项删除吧!

    -p 表示你自己自定义需要加载的类路径,一般情况下用不到

    -i 表示可执行文件的图标

    给程序换图标的方法

    输入命令中添加一个-i tubiao.ico(图标的相对路径)。

    pyinstaller -F -i tubiao123.ico F: estmodifyXmldata.py

    注意

    --需要将程序打包在哪里,就在哪里打开cmd(按住shift键 然后右键,在此处打开cmd窗口)

    --有些资源文件如图片等,可直接复制到exe所在的目录下,否则会报错找不到

    完成后的效果:

     

  • 相关阅读:
    Function overloading and return type
    Function overloading and const keyword
    Function Overloading in C++
    web安全测试相关内容(三)
    web安全测试相关内容(二)
    web安全测试相关内容(一)
    CDNDrive 第一个版本发布 & 布客新知第二次备份完成
    PyTorch 1.4 中文文档校对活动正式启动 | ApacheCN
    布客&#183;ApacheCN 编程/大数据/数据科学/人工智能学习资源 2020.2
    计算机电子书 2019 BiliDrive 备份
  • 原文地址:https://www.cnblogs.com/yaner2018/p/11683814.html
Copyright © 2020-2023  润新知