【问题标题】:Python writing to an xml filePython写入xml文件
【发布时间】:2016-08-26 17:51:24
【问题描述】:

我正在尝试写入 xml 文件。我已经更改了代码中的特定元素,并且能够成功打印它。我需要将其写入文件,而不更改文件的结构。
我的代码:

import os
from lxml import etree


directory = '/Users/eeamesX/work/data/expert/EFTlogs/20160725/IT'
XMLParser = etree.XMLParser(remove_blank_text=True)
for f in os.listdir(directory):
    if f.endswith(".xml"):

        xmlfile = directory + '/' + f



        tree = etree.parse(xmlfile, parser=XMLParser)
        root = tree.getroot()

        hardwareRevisionNode = root.find(".//hardwareRevision")



        if hardwareRevisionNode.text == "5":
            print " "
            print "Old Tag: " + hardwareRevisionNode.text

            x = hardwareRevisionNode.text = "DVT2"

            print "New Tag " +  hardwareRevisionNode.text

当我尝试打开和关闭文件的各种方法时,它只是删除了 xml 文件中的所有数据。使用这种方法

outfile = open(xmlfile, 'w')
oufile.write(etree.tostring(tree))
outfile.close()

将我的文件的代码结构更改为一长行。

【问题讨论】:

标签: python xml lxml elementtree


【解决方案1】:

如果您想替换现有 XML 文件中的值,请使用:

tree.write(xmlfile) 

目前您只是完全覆盖您的文件并使用了不正确的方法 (open())。 tree.write() 通常是您想要使用的。它可能看起来像这样:

tree = etree.parse(xmlfile, parser=XMLParser)
root = tree.getroot()
hardwareRevisionNode = root.find(".//hardwareRevision")
if hardwareRevisionNode.text == "5":
    print "Old Tag: " + hardwareRevisionNode.text
    hardwareRevisionNode.text = "DVT2"
    print "New Tag: " +  hardwareRevisionNode.text
    tree.write(xmlfile)

https://docs.python.org/2/library/xml.etree.elementtree.html

【讨论】:

  • 我需要把它放在底部,它完美地工作
【解决方案2】:

要在输出文件中获取换行符,您似乎需要将 pretty_print=True 传递给您的灭菌(writetostring)调用。

旁注;通常,当您使用 python 打开文件时,您会像这样打开它们:

with open('filename.ext', 'mode') as myfile:
    myfile.write(mydata)

这样可以降低文件描述符泄漏的风险。 tree.write("filename.xml") 方法看起来是避免完全处理文件的好方法。

【讨论】:

  • tree = etree.parse(xmlfile, parser=XMLParser) root = tree.getroot() tree.write(xmlfile) hardwareRevisionNode = root.find(".//hardwareRevision")
  • 更改为该文件会导致文件变成一行,并且文本不会被替换
  • 在上面的 sn-p 中,您正在重新保存原始树。请参阅我编辑的换行问题答案。
  • 它更正了一行,但它没有写入实际文件。它仍然显示 5,而不是 DVT3
  • tree = etree.parse(xmlfile, parser=XMLParser) root = tree.getroot() tree.write(xmlfile, pretty_print=True) hardwareRevisionNode = root.find(".//hardwareRevision")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-15
相关资源
最近更新 更多