pyqt5_实例:修改xml文件中节点值
需求:
将类似如下xml文件的externalid节点值修改成不重复的值

实现该功能的代码Func.py:
#coding=utf-8
'''
Created on 2019年10月15日 @author: yanerfree '''
import re
import sys '''********************************************************
Func Name: modifyData
Para: path : xml文件路径
num : 起始值从num开始,依次递增1
savepath : 修改后的文件保存路径
return:
Desc: 修改xml中<externalid>节点中的值,使其每一条都不同
Date: 20191015
Auth: yanerfree
********************************************************'''
def modifyData(path, num, savepath):
num_externalid = int(num)
f1 = open(path,'r', encoding='utf-8')
line = f1.readline()
#[在re中有特殊含义,需要转义
pattern = re.compile(r'\s*<externalid><!\[CDATA\[\d+\]\]></externalid>') f2 = open(savepath, 'w', encoding='utf-8') while line:
#print('num_externalid:',num_externalid)
m = re.match(pattern, line, flags=0)#没匹配到返回None
#print(m)
if m:
print('替换<externalid>') line = re.sub('\d+', str(num_externalid), line)
#line = ' <externalid><![CDATA[%d]]></externalid>\r\n'%num
num_externalid += 1 print(line)
f2.write(line)
line = f1.readline() f1.close()
f2.close() def testMatch():
pattern = re.compile(r'\s*<externalid><!\[CDATA\[\d+\]\]></externalid>')
s1 = '<externalid><![CDATA[1110]]></externalid>'
p1 = '<externalid><!\[CDATA'#[在re中有特殊含义,需要转义
s2 = 'aasffdafaaa'
p2 = 'a'
m = re.match(pattern, s1, flags=0)#没匹配到返回None
print(m)
print(m.group(0)) def testFindAll():
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'
pattern = re.compile('content:SN=(.*?);MODE=(.*?);TIME=(.*?) .*?LOC=(.*?);TEST_NUM=(.*?);LOC_ERR=(.*?);CONN_ERR=(.*?);SEND_ERR=(.*?);REC_ERR=(\d*)' )
res = re.findall(pattern, s1)
print(res) '''
运行结果:
[('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')]
'''
def testresub():
num=9009
line = ' <externalid><![CDATA[1]]></externalid>'
line = re.sub('\d+', str(num), line)
print(line) if __name__ == '__main__':
#'''
fp = './test001.xml'
sp = './output001.xml'
num = 10
modifyData(fp, num ,sp)
#'''
#testMatch()
#testFindAll()
#testresub()
以上代码单纯实现了需要的功能,但是如果需要给大家使用,不可能让所有人都安装python3环境,并且还安装需要的包,
所以将其进一步开发并打包成exe可执行文件
实现代码 modifyXmldata.py:
#coding=utf-8
'''
Created on 2019年10月15日 @author: yanerfree
'''
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys
import os
import time from Func import * class windowtool(QMainWindow):
def __init__(self):
super().__init__()
self.setupUi() def setupUi(self):
self.setWindowTitle("MyTool - modify externalid")#设置窗体标题
self.resize(600,500)#设置窗体大小
self.setFixedWidth(600)#固定窗体宽度
#self.setFixedSize(600,500)#固定窗体大小
self.createMenu()#菜单
self.createWidget()#创建组件Widget
self.createStatusBar()#创建状态栏 def createMenu(self):
menubar = self.menuBar()##实例化主窗口的QMenuBar对象
#向菜单栏中添加新的QMenu对象,父菜单
menu_file = menubar.addMenu("File")
menu_file.addAction(QAction("Exit",self,triggered=qApp.quit)) menu_Help = menubar.addMenu("Help")
menu_Help.addAction(QAction("About",self,triggered=self.about)) def createWidget(self):
#全局控件(注意参数self),用于承载全局布局
self.wwidget = QWidget(self)
self.wwidget.move(20,40)
self.wwidget.resize(500,400)
#全局布局(注意参数wwidget)
self.wholelayout = QVBoxLayout(self.wwidget) #局部布局-网格布局
glayout = QGridLayout()
glayout.setSpacing(10)
###*******************************************###
label1 = QLabel('选择需要处理的文件(xml):')
button1 = QPushButton("选择文件")
button1.clicked.connect(self.selectxmlfile) self.label_filepath = QLabel()
self.label_filepath.setFrameStyle(QFrame.Panel|QFrame.Sunken) label3 = QLabel('选择文件处理后存放位置:')
button2 = QPushButton("选择路径")
button2.clicked.connect(self.choosedir) self.label_savepath = QLabel()
self.label_savepath.setFrameStyle(QFrame.Panel|QFrame.Sunken) label5 = QLabel('设置 <externalid> 起始值 (整数):')
self.linedit_num = QLineEdit() button_clear = QPushButton("Clear")
button_clear.clicked.connect(self.clean_textedit)
self.textedit_info = QTextEdit() startbutton = QPushButton("Start")
startbutton.clicked.connect(self.start) glayout.addWidget(label1,1,1,1,2)#(1,1)一行一列
glayout.addWidget(button1,2,1,1,1)
glayout.addWidget(self.label_filepath,2,2,1,7)
glayout.addWidget(label3,3,1,1,2)
glayout.addWidget(button2,4,1,1,1)
glayout.addWidget(self.label_savepath,4,2,1,7)
glayout.addWidget(label5,5,1,1,2)
glayout.addWidget(self.linedit_num,5,3,1,2)
glayout.addWidget(startbutton,6,1,1,1)
glayout.addWidget(button_clear,7,8)
glayout.addWidget(self.textedit_info,8,1,8,8)
###*******************************************### self.wholelayout.addLayout(glayout) def createStatusBar(self):
#实例化状态栏
self.statusBar=QStatusBar()
self.statusBar.showMessage("This is status info",4000) #设置状态栏,类似布局设置
self.setStatusBar(self.statusBar) def selectxmlfile(self):
fileName,fileType = QFileDialog.getOpenFileName(self,
"Choose xml file",
r"C:\\",
"Text Files (*.xml);;Text Files (*.txt);;")#设置文件扩展名过滤 fileName = fileName.replace('/','\\')#windows下需要进行文件分隔符转换
print(fileName)
self.label_filepath.setText(fileName)
self.label_savepath.setText('')
#return(fileName) def choosedir(self):
filed,filen = os.path.split(self.label_filepath.text())
savedir = QFileDialog.getExistingDirectory(self,"choose directory to save file",filed)
#print(savedir)
if not os.path.exists(savedir):
return
savedir = savedir.replace('/','\\')#windows下需要进行文件分隔符转换
filen = time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))+'_'+ filen
savedir = os.path.join(savedir, filen)
self.label_savepath.setText(savedir)
#print(savedir) def start(self):
num = self.linedit_num.text()
fp = self.label_filepath.text()
sp = self.label_savepath.text()
text = '-'*20+'\r\n'
text += '文件处理完成'+'\r\n'
text += '处理后文件:'+'\r\n'
text += sp+'\r\n'
if num and fp and sp:
modifyData(fp, num, sp)
#print(self.textedit_info.toPlainText())
self.textedit_info.setText(text+self.textedit_info.toPlainText()) else:
QMessageBox.warning(self,"Warring","请确认设置项是否全部设置完成",QMessageBox.Yes|QMessageBox.No,QMessageBox.Yes) def about(self):
pass def clean_textedit(self):
self.textedit_info.clear() if __name__ == '__main__':
# 每一个pyqt程序中都需要有一个QApplication对象,sys.argv是一个命令行参数列表
app = QApplication(sys.argv)
#实例化窗口
demo = windowtool()
#显示
demo.show()
#进入程序的主循环,遇到退出情况,终止程序
sys.exit(app.exec_())
最后将其打包成exe可执行文件:
需要安装PyInstaller,如未安装,可直接用pip安装即可
命令:pip install PyInstaller
使用pyinstaller打包
打开cmd窗口,把路径切换到文件所在路径,输入以下内容(最后的是文件名):
pyinstaller -F modifyXmldata.py
或者直接全路径打包,不需要在cmd中将路径切换到脚本所在路径:
pyinstaller -F F:\test\modifyXmldata.py
另,打包时可以添加参数:
pyinstaller -F F:\test\modifyXmldata.py
pyinstaller -F -w F:\test\modifyXmldata.py
参数含义
-F 表示生成单个可执行文件
-w 表示去掉控制台窗口,这在GUI界面时非常有用。不过如果是命令行程序的话那就把这个选项删除吧!
-p 表示你自己自定义需要加载的类路径,一般情况下用不到
-i 表示可执行文件的图标
给程序换图标的方法
输入命令中添加一个-i tubiao.ico(图标的相对路径)。
pyinstaller -F -i tubiao\123.ico F:\test\modifyXmldata.py
注意
--需要将程序打包在哪里,就在哪里打开cmd(按住shift键 然后右键,在此处打开cmd窗口)
--有些资源文件如图片等,可直接复制到exe所在的目录下,否则会报错找不到
完成后的效果:


pyqt5_实例:修改xml文件中节点值的更多相关文章
- 读取xml文件中节点
/// <summary> /// /// </summary> /// <param name="xmlpath">节点路径</para ...
- C#程序中:如何修改xml文件中的节点(数据)
要想在web等程序中实现动态的数据内容给新(如网页中的Flash),不会更新xml文件中的节点(数据)是远远不够的,今天在这里说一个简单的xml文件的更新,方法比较基础,很适合初学者看的,保证一看就懂 ...
- vue项目中使用bpmn-流程图xml文件中节点属性转json结构
内容概述 本系列“vue项目中使用bpmn-xxxx”分为七篇,均为自己使用过程中用到的实例,手工原创,目前陆续更新中.主要包括vue项目中bpmn使用实例.应用技巧.基本知识点总结和需要注意事项,具 ...
- .net中读取xml文件中节点的所有属性信息
功能描述: 将数据以xml的格式记录成配置文件,需要获取配置文件中的数据时,则获取对应的配置文件,读取配置文件里对应节点的所有属性. 逻辑实现: 1.将数据配置好在xml文件中. 2.获取xml文件中 ...
- PHP读取XML文件数据获取节点值
最近在接入渠道的时候遇到接口返回是xml数据.现在接口数据返回json数据格式比较常见. 如何获取xml里面真正数据? 对象结果集合单个值的强制转换处理.(直接代码说明) demo示例: 创建xml ...
- ANDROID中获取STRING.XML,DIMENS.XML等资源文件中的值
一:是为了国际化,当需要国际化时,只需要再提供一个string.xml文件,把里面的汉子信息都修改为对应的语言(如,English),再运行程序时,android操作系统会根据用户手机的语言环境和国家 ...
- C#程序中:如何向xml文件中插入节点(数据)
向xml文件中动态的添加节点(数据)是一件很爽的事,可以给你的程序带来很多的方便,比如在web中,如果你的Flash用到了xml文件,这个方法可以让你在后台就轻轻松松的更新你的Flash内容哦!一起研 ...
- 读取xml文件中的配置参数实例_java - JAVA
文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 paras.xml文件 <?xml version="1.0" encoding=" ...
- C#窗体中读取修改xml文件
由于之前没有操作过xml文件,尤其是在窗体中操作xml,脑子一直转不动,而且很抵制去做这个功能,终于还是突破了自己通过查询资料完成了这个功能,在此记录一下自己的成果. 功能说明:程序中存在的xml文件 ...
随机推荐
- 基于规则的分类——RIPPER算法
在<分类:基于规则的分类技术>中已经比较详细的介绍了基于规则的分类方法,RIPPER算法则是其中一种具体构造基于规则的分类器的方法.在RIPPER算法中,有几个点是算法的重要构成部分,需要 ...
- CodeForces - 260C
CodeForces - 260C Little Vasya had n boxes with balls in the room. The boxes stood in a row and were ...
- Centos7.x 装机优化
Linux 服务器装机后优化 参考 https://blog.csdn.net/u010133338/article/details/81055475 优化初始化脚本 vim init_optimiz ...
- jmeter4.0,启动jmeter.bat闪退问题
问题描述: 电脑重装win10系统,配置好了java环境后,解压jmeter的zip包,然后按照网上的教程配置环境变量,然后兴冲冲启动jmeter.bat,结果,闪退,甚至连个报错信息都没有... 然 ...
- 一文带你学会java的jvm精华知识点
前言 本文分为20多个问题,通过问题的方式,来逐渐理解jvm,由浅及深.希望帮助到大家. 1. Java类实例化时,JVM执行顺序? 正确的顺序如下: 1父类静态代码块 2父类静态变量 3子类静态代码 ...
- zabbix监控nginx日志状态码
监控需求 监控Nginx常见的状态码并对其进行监控,对常见的错误状态码创建相对应的触发器以下按照分钟对数据进行抓取 Zabbix_Agentd创建监控脚本 1)创建脚本之前核对Nginx日志格式我这里 ...
- dp 20190617
A. Alternative Thinking 这个标的是dp,但是我感觉就只能算思维题,不是特别难, 你仔细想想就知道,你先求出01这样子满足条件的个数,如果要进行改变,最多只可以增加两个,也可以增 ...
- vim基础快捷键
vim快捷键 1. 移动光标 快捷键 作用 h 光标向左移动一个字符 j 光标向下移动一个字符 k 光标向上移动一个字符 l 光标向右移动一个字符 6j 向下移动6个字符 Ctrl+f 屏幕向下移动一 ...
- SpringCloudStream学习(四)TTL(存活时间)Dead Letter Exchanges(死信交换机)
TTL(Time-To-Live and Expiration): RabbitMQ既能对队列设置TTL也能对消息设置TTL,消息TTL可以应用于单个队列.一组队列或应用于逐个消息. 如何给消息设置T ...
- Java常用关键字总结
1.abstract abstract修饰类,表示抽象的意思,抽象类可以含有非抽象变量和成员变量,也可以有普通方法和构造方法,但是不能被实例化(接口),但是可以被子类继承. public abstra ...