需求:

将类似如下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文件中节点值的更多相关文章

  1. 读取xml文件中节点

    /// <summary> /// /// </summary> /// <param name="xmlpath">节点路径</para ...

  2. C#程序中:如何修改xml文件中的节点(数据)

    要想在web等程序中实现动态的数据内容给新(如网页中的Flash),不会更新xml文件中的节点(数据)是远远不够的,今天在这里说一个简单的xml文件的更新,方法比较基础,很适合初学者看的,保证一看就懂 ...

  3. vue项目中使用bpmn-流程图xml文件中节点属性转json结构

    内容概述 本系列“vue项目中使用bpmn-xxxx”分为七篇,均为自己使用过程中用到的实例,手工原创,目前陆续更新中.主要包括vue项目中bpmn使用实例.应用技巧.基本知识点总结和需要注意事项,具 ...

  4. .net中读取xml文件中节点的所有属性信息

    功能描述: 将数据以xml的格式记录成配置文件,需要获取配置文件中的数据时,则获取对应的配置文件,读取配置文件里对应节点的所有属性. 逻辑实现: 1.将数据配置好在xml文件中. 2.获取xml文件中 ...

  5. PHP读取XML文件数据获取节点值

    最近在接入渠道的时候遇到接口返回是xml数据.现在接口数据返回json数据格式比较常见. 如何获取xml里面真正数据? 对象结果集合单个值的强制转换处理.(直接代码说明) demo示例:  创建xml ...

  6. ANDROID中获取STRING.XML,DIMENS.XML等资源文件中的值

    一:是为了国际化,当需要国际化时,只需要再提供一个string.xml文件,把里面的汉子信息都修改为对应的语言(如,English),再运行程序时,android操作系统会根据用户手机的语言环境和国家 ...

  7. C#程序中:如何向xml文件中插入节点(数据)

    向xml文件中动态的添加节点(数据)是一件很爽的事,可以给你的程序带来很多的方便,比如在web中,如果你的Flash用到了xml文件,这个方法可以让你在后台就轻轻松松的更新你的Flash内容哦!一起研 ...

  8. 读取xml文件中的配置参数实例_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 paras.xml文件 <?xml version="1.0" encoding=" ...

  9. C#窗体中读取修改xml文件

    由于之前没有操作过xml文件,尤其是在窗体中操作xml,脑子一直转不动,而且很抵制去做这个功能,终于还是突破了自己通过查询资料完成了这个功能,在此记录一下自己的成果. 功能说明:程序中存在的xml文件 ...

随机推荐

  1. 【Linux常见命令】echo命令

    echo - display a line of text 打印输出内容的常用命令,可以结合重定向>和追加>>对文件进行覆盖或追加内容. 语法: echo [SHORT-OPTION ...

  2. 3DMAX导出到Unity坐标轴转换问题

      这是我在3dmax中创建的1cm*1cm*1cm的立方体,右图为3dmax中的坐标系 当我们把这个立方体导入到unity中发现x轴意外的扭转了90度 为了解决这个问题,你需要对模型做出修正 1.选 ...

  3. vue 跳转并传参,实现数据实时更新

    原文链接:点我 比如我现在在页面A跳转到页面B,A中的router-link :to={path:’B’,params:{id:’5’}} 求助:在页面B中的mounted生命周期函数中使用this. ...

  4. tarjan 算法应用

    主要讲证明,流程倒是也有 然后发现自己并不会严谨证明 其实后面一些部分流程还是挺详细 本来这篇blog叫做"图论部分算法证明",然后发现OI中的图论想完全用数学上的方法证明完全超出 ...

  5. Jenkins 部署(基于 Linux)

    1.安装 JDK  我不列出来了,自行百度 java -version 2.安装 tomcat (1)创建目录 tomcat8 (2)导入 tomcat 文件到 tomcat8 录中并解压 (3)启动 ...

  6. nnIPXougCC

    13:58:31           2020-03-14 发现一本书叫做<活法> 学习ing 2020-03-14 15:22:36 太快 ,练习了一会sql语句和打字 想看一会 憨豆特 ...

  7. three.js中的矩阵变换(模型视图投影变换)

    目录 1. 概述 2. 基本变换 2.1. 矩阵运算 2.2. 模型变换矩阵 2.2.1. 平移矩阵 2.2.2. 旋转矩阵 2.2.2.1. 绕X轴旋转矩阵 2.2.2.2. 绕Y轴旋转矩阵 2.2 ...

  8. Java笔记(day14-17)

    集合类的由来: 对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定. 就使用集合容器进行存储. 集合特点: 1,用于存储对象的容器. 2,集合的长度是可变的. 3,集合中不可以存储基本数据类 ...

  9. SpringBoot:整合Shiro

    目录 1.Shiro简介 1.1.什么是Shiro? 1.2.有哪些功能 1.3.Shiro架构(外部) 1.4.Shiro架构(内部) 2.HelloWorld 3.Shiro整合Spring Bo ...

  10. 在web项目中使用shiro(认证、授权)

    一.在web项目中实现认证 第一步,在web项目中导入shiro依赖的包 第二步,在web.xml中声明shiro拦截权限的过滤器 <filter> <filter-name> ...