TypeError:write()得到了一个意外的关键字参数' pretty_print'

时间:2015-08-11 12:53:39

标签: python python-2.7

我正在编写一个python脚本,它将在我的jenkins作业的config.xml中附加一个新的Tag / elment。

这就是我的脚本的样子: -

#!/usr/bin/python

import os, fnmatch, pdb, re, string, fileinput, sys
from lxml import etree
def find(pattern, path):
result = []
for root, dirs, files in os.walk(path):
    for name in files:
        if fnmatch.fnmatch(name, pattern):
            result.append(os.path.join(root, name))
return result

finalresult = find('config.xml', './')
print finalresult
def writexml(filepath):
tree = etree.parse(filepath)
root = tree.getroot()
a=[]
for v in root.iter('publishers'):
        for a in v:
            if a.tag == "hudson.plugins.emailext.ExtendedEmailPublisher":
                t1=etree.SubElement(v,'org.jenkinsci.plugins.postbuildscript.PostBuildScript',{'plugin':"postbuildscript@017"})
                t2=etree.SubElement(t1,"buildSteps")
                t3=etree.SubElement(t2,'hudson.tasks.Shell')
                t4=etree.SubElement(t3,"command")
                t4.text = "bash -x /d0/jenkins/scripts/parent-pom-enforcer.sh"
                t5 = etree.SubElement(t1,'scriptOnlyIfSuccess')
                t5.text = "false"
                t6 = etree.SubElement(t1,'scriptOnlyIfFailure')
                t6.text = "false"
                t7= etree.SubElement(t1,'markBuildUnstable')
                t7.text = "true"

tree.write(filepath,pretty_print=True)

findMavenProject=[]
for i in finalresult:
tree = etree.parse(i)
root = tree.getroot()
for v in  root.iter('hudson.tasks.Maven'):
    if v.tag == "hudson.tasks.Maven":
        writexml(i)
        findMavenProject.append(i)
print findMavenProject

当我执行此脚本时,出现以下错误:

  running with cElementTree on Python 2.5+
  ['./jen1/config.xml', './jen2/config.xml', './jen3/config.xml',     './jen4/config.xml']
  Traceback (most recent call last):
  File "./find-test.py", line 50, in <module>
  writexml(i)
  File "./find-test.py", line 41, in writexml
  tree.write(filepath,pretty_print=True)
  TypeError: write() got an unexpected keyword argument 'pretty_print'

我搜索了这个错误并发现,我应该使用&#34; lxml&#34;。我用它但是在那之后我得到了同样的错误。我使用的是Python 2.7.6版本..

有任何线索吗?

3 个答案:

答案 0 :(得分:1)

tree.write(filepath,pretty_print=True)错了。

正确的方式:tree.write(filepath)tree.tostring(root, pretty_print=True)

详细说明:

treeElementTree Objectswrite没有pretty_print参数。

write(file, encoding="us-ascii", xml_declaration=None, default_namespace=None, method="xml")
  

将元素树作为XML写入文件。 file是文件名,或者是为写入而打开的文件对象。 encoding [1]是输出编码(默认为US-ASCII)。 xml_declaration控制是否应将XML声明添加到文件中。永远使用False,始终使用True,仅当不是US-ASCII或UTF-8时使用None(默认为None)。 default_namespace设置默认的XML命名空间(对于“xmlns”)。方法是&#34; xml&#34;,&#34; html&#34;或&#34;文字&#34; (默认为&#34; xml&#34;)。返回一个编码的字符串。

xml.etree.ElementTree.Element docs

更新

要回答另一个问题,Pretty printing XML in Python

import xml.dom.minidom

my_xml_doc = xml.dom.minidom.parse(xml_fname) # or xml.dom.minidom.parseString(xml_string)
pretty_xml_as_string = my_xml_doc.toprettyxml()

<强> UPDATE2

lxml.etree确实有pretty_print参数,如下所示:

etree.tostring(root, pretty_print=True)

lxml docs

特别感谢@RemcoGerlich

答案 1 :(得分:1)

Python的标准库xml.etree.ElementTree.write()没有pretty_print参数。

lxml 的最新版本中该方法的版本。我刚用lxml 3.3.3测试了它,而http://lxml.de/tutorial.html#serialisation的文档提到了它。

您要么使用旧版本的lxml,要么仍然使用标准库的旧版本库。

答案 2 :(得分:0)

以下代码的问题是它会创建带有标签的重复空行。如果您正在尝试编辑现有的xml。

import xml.dom.minidom
xml = xml.dom.minidom.parse(xml_fname) # or xml.dom.minidom.parseString(xml_string)
pretty_xml_as_string = xml.toprettyxml()

解决方案: - 我尝试了以下代码,它对我有用。

from lxml import etree as ET
import xml.dom.minidom      
def writexml(filepath):
    parser = ET.XMLParser(resolve_entities=False, strip_cdata=False)
    tree = ET.parse(filepath, parser)
    root = tree.getroot()
    a=[]     
    for v in root.iter('publishers'):
        for a in v:
            if a.tag == "hudson.plugins.emailext.ExtendedEmailPublisher":
                t1=ET.SubElement(v,'org.jenkinsci.plugins.postbuildscript.PostBuildScript',{'plugin':"postbuildscript@0.17"})
                t2=ET.SubElement(t1,"buildSteps")
                t3=ET.SubElement(t2,'hudson.tasks.Shell')
                t4=ET.SubElement(t3,"command")
                t4.text = "bash -x /d0/jenkins/scripts/parent-pom-enforcer.sh"
                t5 = ET.SubElement(t1,'scriptOnlyIfSuccess')
                t5.text = "false"
                t6 = ET.SubElement(t1,'scriptOnlyIfFailure')
                t6.text = "false"
                t7= ET.SubElement(t1,'markBuildUnstable')
                t7.text = "true"
    xml1 = xml.dom.minidom.parseString(ET.tostring(root, pretty_print=True))
    pretty_xml_as_string = xml1.toprettyxml()
    f = open(filepath, "w")
    for v in str(pretty_xml_as_string).split("\n"):
        if v.strip():
            f.write(v+"\n")
    f.close()

writexml('test.xml')#provide文件的完整路径为arg to function writexml。