Skip to main content
 首页 » 编程设计

python之仅替换文件中第一次出现的字段/单词

2025年05月04日10pander-it

我有一些具有以下结构的 zip 文件 ( 700+ ) ( 文件完全像这样 )

<?xml version="1.0" encoding="UTF-8"?> 
<Values version="2.0"> 
<record name="trigger"> 
    <value name="uniqueId">6xjUCpDlrTVHRsEVmxx0Ews6ni8=</value> 
    <value name="processingSuspended">false</value> 
    <value name="retrievalSuspended">false</value> 
</record> 
<record name="trigger"> 
    <value name="uniqueId">6xjUCpDlrTVHRsEVmxx0Ews6ni8=</value> 
    <value name="processingSuspended">false</value> 
    <value name="retrievalSuspended">false</value> 
</record> 
</Values> 

我想要实现的是替换,无论第一次出现的字段 processingSuspended 和 retrievalSuspended 的值是真还是假。将其替换为 false。但仅限于第一次出现。

编辑:

根据要求,我添加了我目前拥有的内容,在那里我可以获得我想要的字段,但是。我相信有一种更简单的方法可以做到这一点。:

import os 
import zipfile 
import glob 
import time 
import re 
 
def main(): 
    rList = [] 
    for z in glob.glob("*.zip"): 
        root = zipfile.ZipFile(z) 
        for filename in root.namelist(): 
            if filename.find("node.ndf") >= 0: 
                for line in root.read(filename).split("\n"): 
                    if line.find("broker-trigger") >= 0: 
                        for iline in root.read(filename).split("\n"): 
                            Values = dict() 
                            #match Processing state 
                            if iline.find("processingSuspended") >= 0: 
                                mpr = re.search(r'(.*>)(.*?)(<.*)',  
                                                iline, re.M|re.I) 
                            #match Retrieval state 
                            if iline.find("retrievalSuspended") >= 0: 
                                mr = re.search(r'(.*>)(.*?)(<.*)',  
                                               iline, re.M|re.I) 
                                Values['processingSuspended'] = mpr.group(2) 
                                Values['retrievalSuspended'] = mr.group(2) 
                                #print mr.group(2) 
                                rList.append(Values) 
    print rList 
 
if __name__== "__main__": 
    main() 

提前致谢。

请您参考如下方法:

尝试使用 lxml :

>>> xml = '''\ 
<?xml version="1.0" encoding="UTF-8"?> 
<Values version="2.0"> 
<record name="trigger"> 
    <value name="uniqueId">6xjUCpDlrTVHRsEVmxx0Ews6ni8=</value> 
    <value name="processingSuspended">true</value> 
    <value name="retrievalSuspended">true</value> 
</record> 
<record name="trigger"> 
    <value name="uniqueId">6xjUCpDlrTVHRsEVmxx0Ews6ni8=</value> 
    <value name="processingSuspended">true</value> 
    <value name="retrievalSuspended">true</value> 
</record> 
</Values>\ 
''' 
 
>>> from lxml import etree 
>>> tree = etree.fromstring(xml) 
>>> tree.xpath('//value[@name="processingSuspended"]')[0].text = 'false' 
>>> tree.xpath('//value[@name="retrievalSuspended"]')[0].text = 'false' 

这个xpath表达式'//value[@name="processingSuspended"]'找到所有标签value 的属性 name 等于 "processingSuspended"。然后我们只使用第一个 [0] 并将标签的文本更改为 'false'。

输出:

>>> print(etree.tostring(tree, pretty_print=True)) 
<Values version="2.0"> 
<record name="trigger"> 
    <value name="uniqueId">6xjUCpDlrTVHRsEVmxx0Ews6ni8=</value> 
    <value name="processingSuspended">false</value> 
    <value name="retrievalSuspended">false</value> 
</record> 
<record name="trigger"> 
    <value name="uniqueId">6xjUCpDlrTVHRsEVmxx0Ews6ni8=</value> 
    <value name="processingSuspended">true</value> 
    <value name="retrievalSuspended">true</value> 
</record> 
</Values> 
 
>>>