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文件 ...
随机推荐
- Eclipse Mac OS 安装 最新版 Subversion插件subclipse
subclipse 目前全部转移到github 官方地址 https://github.com/subclipse/subclipse/wiki Eclipse mac版 安装 最新版svn插件sub ...
- 谈谈你对vuex的理解
vuex创建公有仓库的插件 1.储存公共状态 2.能够根据事件来修改状态 3.多个组件都需要变化,有机制把这个新的状态通知给所有的组件 vuex中的四个类 1.state 定义需要共享的状态 2 ...
- 我对sessionid的理解
不知道是不是扯蛋,还是太菜... 看上面的的话毫不关系是吧...自己看过一点 关于 说session id 的 一些文章, 貌似都是一样的....以下内容个人理解, 请大家指正... 我想自己举个例子 ...
- USACO Training Section 1.1黑色星期五Friday the Thirteenth
题目描述 13号又是一个星期五.13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数.给出N年的一个周期,要求计算1900年1月1日至1900+N- ...
- 图论--SCC缩点--Tarjan
// Tarjan算法求有向图强连通分量并缩点 /*强连通缩点与双连通缩点大同小异,也就是说将强连通分支缩成一个点之后,没有强连通,成为有向无环图,在对图进行题目的操作.*/ #include< ...
- Jenkins 介绍
持续集成: 持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证 ...
- Effective C++学习记录
Effective C++算是看完了,但是并没有完全理解,也做不到记住所有,在此记录下55个条款及条款末的"请记住". 让自己习惯C++ 条款01:视C++为一个语言联邦 ① C ...
- centos7 安装高版本svn
一.安装高版本svn 1.创建一个新的yum库文件,vim /etc/yum.repos.d/wandisco-svn.repo 内容如下 [WandiscoSVN] name=Wandisco SV ...
- [Abp vNext 入坑分享] - 5.全局异常替换
一.简要说明 [项目源码] [章节目录] 前面我们已经初步完成了框架的功能了,jwt的也已经接入完成了. 现在需要进行全局异常的接入了,abpvnext官方本来就有了全局异常的模块了,介绍链接 ...
- mybatis添加信息自动生成主键
一.使用Oracle数据库 举例:添加员工的时候自动生成主键 1.在dao接口中声明方法 2.在mapper中实现该方法 需要先在数据表中创建序列 3.测试 注意:在调用过save方法之后,emp对象 ...