【问题标题】:Replace specific string in an XML file替换 XML 文件中的特定字符串
【发布时间】:2021-01-02 05:01:25
【问题描述】:

我想用变量的值替换文件中的特定字符串:

在我的文件中有这两行:

<CtrlSum>10</CtrlSum>
<sum>45</sum>

我想搜索值“10”并将其替换为“45”。

我尝试过类似的方法:

with open(path,'r+') as f:
    lst=f.readlines()
    for j in lst:
        if'sum' in j:
            Somme = j.split('>')[1].split('<')[0]
            print(Somme)

    for i in lst:
        if 'CtrlSum' in i:
            Ctrl = i.split('>')[1].split('<')[0]
    print (Ctrl)

    f.writelines(f.replace(Ctrl,Somme))

但我有这个错误:

f.writelines(f.replace(Ctrl,Somme)) AttributeError: '_io.TextIOWrapper' 对象没有属性 'replace'

出了什么问题,我该如何解决?

【问题讨论】:

  • f 是一个文件。你只能在一个字符串上调用.replace()(即.read()的结果)
  • 通常我创建另一个文件,将修改后的内容复制到其中,然后重命名以覆盖原始文件
  • 你想做什么?用什么替换什么字符串? - 您打算通过这些拆分实现什么目标?
  • 我想用 "Sum" @DevCl9 的值替换 "CtrlSum" 上 之间的值
  • 您是在问如何解析 XML 或 HTML 文件?

标签: python xml file


【解决方案1】:

你可以简单地做这样的事情:

import re

with open('a.txt','r') as f:
    text_value = f.read()

    sum_val = sum(map(int, re.findall(r'<sum>(\d+)</sum>', text_value)))

with open('a.txt','w') as f:
    f.write(re.sub(r'<CtrlSum>(.+)</CtrlSum>', f'<CtrlSum>{sum_val}</CtrlSum>', text_value))

不需要readlines()writelines() 或任何循环。只需使用.read() 阅读全文 -> 处理它 -> write()

【讨论】:

  • 是的,但没有 readlines() 我不能循环遍历我的文件来寻找我正在搜索的不同出现:在这种情况下, 之间的值在 "CtrlSum" String @DevCl9 之后
  • WDYM?你能分享一个示例输入文件和所需的输出吗? (如果这段代码没有删减它)
  • 想象一下,如果我的文件中有这两行: 1045 我想搜索值“10”并将其替换为“ 45",如果不是很清楚,请见谅! @DevCl9
  • 是的!但是在第一个之后附加所有文本,有没有办法覆盖它?
  • 是的,但是如果“Sum”多次出现,有没有办法添加它们?@DevCl9
【解决方案2】:

replace() 函数只能用于字符串。 您的 f 不是字符串,而是文件本身。您需要调用 f.read() 以将文件内容作为字符串获取并在此调用 replace()。

编辑:查看此链接,它解释了写入文件的不同方法:)

https://pythonexamples.org/python-replace-string-in-file/

【讨论】:

    【解决方案3】:

    使用 XML 解析

    import xml.etree.ElementTree as ET
    
    xml = '''<r><CtrlSum>10</CtrlSum>
    <sum>45</sum></r>'''
    
    root = ET.fromstring(xml)
    root.find('.//CtrlSum').text = root.find('.//sum').text
    ET.dump(root)
    

    输出

    <r>
       <CtrlSum>45</CtrlSum>
       <sum>45</sum>
    </r>
    

    【讨论】:

    • 但是当 xml 文件有很多元素和子元素和子子元素时,这个解决方案是否可行?或者它只是与这个例子一起工作?@balderman
    • 在您的 xml 上试用并提供反馈
    【解决方案4】:

    XSLT 3.0 解决方案:

    <xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:mode on-no-match="shallow-copy"/>
     <xsl:template match="CtrlSum/text()">
       <xsl:value-of select="//sum"/>
     </xsl:template>
    </xsl:transform>
    

    (也可以使用 XSLT 1.0,只是稍微冗长一些)。

    【讨论】:

      猜你喜欢
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      • 2018-12-13
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多