Python TypeError:write()获得意外的关键字参数';漂亮的印刷品';

Python TypeError:write()获得意外的关键字参数';漂亮的印刷品';,python,python-2.7,Python,Python 2.7,我正在编写一个python脚本,它将在我的jenkins作业的config.xml中附加一个新标记/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 nam

我正在编写一个python脚本,它将在我的jenkins作业的config.xml中附加一个新标记/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'
在Python 2.5上使用cElementTree运行+ ['./jen1/config.xml'、'./jen2/config.xml'、'./jen3/config.xml'、'./jen4/config.xml'] 回溯(最近一次呼叫最后一次): 文件“/find test.py”,第50行,在 writexml(i) 文件“/find test.py”,第41行,writexml格式 write(文件路径,pretty\u print=True) TypeError:write()得到一个意外的关键字参数'pretty\u print' 我在谷歌上搜索了这个错误,发现我应该使用“lxml”。我用过它,但即使在那之后,我也会犯同样的错误。我使用的是Python 2.7.6版本

有什么线索吗?

树的write(filepath,pretty\u print=True)是错误的

正确的方法:
tree.write(filepath)
tree.tostring(root,pretty\u print=True)


详细说明:

tree
是一个
ElementTree对象
,它的
write
没有
pretty\u print
参数

write(file, encoding="us-ascii", xml_declaration=None, default_namespace=None, method="xml")
将元素树作为XML写入文件。文件是一个文件名,或一个打开以进行写入的文件对象。编码[1]是输出编码(默认为US-ASCII)。xml_声明控制是否应将xml声明添加到文件中。如果不是US-ASCII或UTF-8,则使用False表示从不,True表示始终,None表示无(默认值为None)。default_namespace设置默认的XML命名空间(用于“xmlns”)。方法是“xml”、“html”或“text”(默认值是“xml”)。返回一个编码字符串


更新

回答另一个问题:


更新2

lxml.etree确实有
pretty\u print
参数,如下所示:

etree.tostring(root, pretty_print=True)


特别感谢@RemcoGerlich

Python的标准库
xml.etree.ElementTree.write()
没有pretty\u print参数

write(file, encoding="us-ascii", xml_declaration=None, default_namespace=None, method="xml")
在最新版本的
lxml
中,该方法的版本不适用。我刚刚用lxml3.3.3测试了它,当时的文档提到了它


您可能正在使用旧版本的lxml,或者仍然在使用标准库的旧版本。

下面代码的问题是,它创建了重复的带制表符的空行。如果您试图编辑现有的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')#提供文件的完整路径作为函数writexml的参数。

这很奇怪,因为
lxml.etree
s树对象
write()
方法肯定有这个关键字参数。@BlackJack为什么这么肯定?在v4.2.1中,它肯定不会(python3)[我意识到这是3年后的事:(]@Cipriantomoagă我已经安装了v4.2.5,也是Python3,并且这个方法仍然有这个关键字参数。当然。@BlackJack谢谢你的确认!你帮助我意识到我使用它是错误的,因为我导入了
ElementTree
,而不是
etree
。也就是说,不要这样做:
导入lxml.etree.ElementTree作为et
。相反,请执行:
import lxml.etree as et
Hi Loolou,感谢您的回复。感谢您的帮助。事实上,问题是我尝试了“tree.write(filepath)”,但它只在xml文件的一行中写入。如何像pretty_print那样在多行中获取它。我指的是一个正确的xml。下面是我刚刚给出的示例时,它是如何在一行中添加的“tree.wrtie(filepath)bash-x/d0/jenkins/scripts/parent-pom-enforcer.shfalsefalsetrue我更新了我的答案另一个问题
Python中的漂亮打印XML
@loolou:他正在尝试使用lxml.etree,它确实有漂亮打印参数:。