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

Python 仅替换文件中第一次出现的字段/单词,python,zipfile,Python,Zipfile,我有一些ZipFile(700+)具有以下结构(文件与此完全相同) 6xJUCPDLRTvHRESVMXX0EWS6NI8= 假的 假的 6xJUCPDLRTvHRESVMXX0EWS6NI8= 假的 假的 我想要实现的是替换,无论第一次出现的字段processingSuspended和RetrievalsSuspended的值是真还是假。将其替换为false。但这只是第一次 编辑: 通过请求,我添加到目前为止我所拥有的,在那里我可以得到我想要的字段,但是。我相信有一种更简单的方法可以做到这

我有一些ZipFile(700+)具有以下结构(文件与此完全相同)


6xJUCPDLRTvHRESVMXX0EWS6NI8=
假的
假的
6xJUCPDLRTvHRESVMXX0EWS6NI8=
假的
假的
我想要实现的是替换,无论第一次出现的字段processingSuspendedRetrievalsSuspended的值是真还是假。将其替换为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()
导入操作系统
进口拉链
导入glob
导入时间
进口稀土
def main():
rList=[]
对于glob.glob(“*.zip”)中的z:
root=zipfile.zipfile(z)
对于root.namelist()中的文件名:
如果filename.find(“node.ndf”)>=0:
对于root.read(文件名).split(“\n”)中的行:
如果line.find(“代理触发器”)>=0:
对于root.read(文件名).split(“\n”)中的iline:
值=dict()
#匹配处理状态
如果iline.find(“processingSuspended”)>=0:
mpr=re.search(r'(.*)(.*)(.*)(.*)(.*)(尝试使用:


您可以使用Python的内置模块读取zip归档文件并更新其中包含的xml格式数据。for
xml.etree.ElementTree
中甚至有教程

import glob
import xml.etree.ElementTree as ET
import zipfile

def main():
    for z in glob.glob("*.zip"):
        print 'processing file: {!r}'.format(z)
        zfile = zipfile.ZipFile(z)
        for filename in zfile.namelist():
            print 'processing archive member: {!r} in {}'.format(filename, z)
            contents = zfile.open(filename).read()

            print 'Before changes:'
            print contents

            root = ET.fromstring(contents)
            if root.tag != "Values" or root.attrib["version"] != "2.0":
                print 'unsupported xml file'
                break

            if(root[0][1].tag == "value" and
               root[0][1].attrib["name"] == "processingSuspended"):
                root[0][1].text = "false"
            else:
                print 'expected "processingSuspended" value field not found'
                break

            if(root[0][2].tag == "value" and
               root[0][2].attrib["name"] == "retrievalSuspended"):
                root[0][2].text = "false"
            else:
                print 'expected "retrievalSuspended" value field not found'
                break

            print 'After changes:'
            updated_contents = ET.tostring(root)
            print updated_contents

if __name__== "__main__":
    main()

我们很乐意帮助您解决您面临的具体问题,但我们不会为您做任何工作。到目前为止,您做了哪些尝试?@thegrinner,谢谢您的回复,但我并没有要求有人做我的工作,我只是在为我如何做而挣扎。目前,我有一个80行的脚本,可以在服务器上标识哪些文件具有Property procEssing Suspended或Retrievals Suspended。我可以将其粘贴到这里,但它似乎与问题无关。我的主要问题是,即使在搜索stackoverflow和python文档后,我也不知道如何执行此操作。如果这是XML,为什么不使用XML解析器?@WaleedKhan但使用XML解析器,我可以替换前两个我想要的字段?如果可能的话,你能提供一个例子吗?看一看。你会写决定替换什么的逻辑,但这不会太糟糕。基本思想是使用XML解析器在XML中读取,使用DOM方法编辑,然后使用编辑过的文档将其写回。谢谢你的回复,但是我如何将更改写入到文件?@Thales
etree.tostring(tree,pretty\u print=True)
生成字符串。使用
file\u handle.Write()将其写入文件。
>>> 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'
>>> 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>

>>> 
import glob
import xml.etree.ElementTree as ET
import zipfile

def main():
    for z in glob.glob("*.zip"):
        print 'processing file: {!r}'.format(z)
        zfile = zipfile.ZipFile(z)
        for filename in zfile.namelist():
            print 'processing archive member: {!r} in {}'.format(filename, z)
            contents = zfile.open(filename).read()

            print 'Before changes:'
            print contents

            root = ET.fromstring(contents)
            if root.tag != "Values" or root.attrib["version"] != "2.0":
                print 'unsupported xml file'
                break

            if(root[0][1].tag == "value" and
               root[0][1].attrib["name"] == "processingSuspended"):
                root[0][1].text = "false"
            else:
                print 'expected "processingSuspended" value field not found'
                break

            if(root[0][2].tag == "value" and
               root[0][2].attrib["name"] == "retrievalSuspended"):
                root[0][2].text = "false"
            else:
                print 'expected "retrievalSuspended" value field not found'
                break

            print 'After changes:'
            updated_contents = ET.tostring(root)
            print updated_contents

if __name__== "__main__":
    main()