如何在脚本中比较python中的两个xml文件?
我是新来的蟒蛇。我有一些预定义的xml文件。我有一个生成新xml文件的脚本。我想写一个自动脚本来比较xmls文件,并在输出文件中存储不同xml文件名的名称?如何在脚本中比较python中的两个xml文件?,python,xml,file,python-2.7,filecompare,Python,Xml,File,Python 2.7,Filecompare,我是新来的蟒蛇。我有一些预定义的xml文件。我有一个生成新xml文件的脚本。我想写一个自动脚本来比较xmls文件,并在输出文件中存储不同xml文件名的名称? 提前谢谢我想您正在寻找合适的人选。您可以这样使用它: import filecmp cmp = filecmp.cmp('f1.xml', 'f2.xml') # Files are equal if cmp: continue else: out_file.write('f1.xml') 用您的xml文件替换f1.x
提前谢谢我想您正在寻找合适的人选。您可以这样使用它:
import filecmp
cmp = filecmp.cmp('f1.xml', 'f2.xml')
# Files are equal
if cmp:
continue
else:
out_file.write('f1.xml')
用您的xml文件替换
f1.xml
和f2.xml
。我想您正在寻找。您可以这样使用它:
import filecmp
cmp = filecmp.cmp('f1.xml', 'f2.xml')
# Files are equal
if cmp:
continue
else:
out_file.write('f1.xml')
用xml文件替换
f1.xml
和f2.xml
。基于@Xaranke的答案:
import filecmp
out_file = open("diff_xml_names.txt")
# Not sure what format your filenames will come in, but here's one possibility.
filePairs = [('f1a.xml', 'f1b.xml'), ('f2a.xml', 'f2b.xml'), ('f3a.xml', 'f3b.xml')]
for f1, f2 in filePairs:
if not filecmp.cmp(f1, f2):
# Files are not equal
out_file.write(f1+'\n')
out_file.close()
基于@Xaranke的答案:
import filecmp
out_file = open("diff_xml_names.txt")
# Not sure what format your filenames will come in, but here's one possibility.
filePairs = [('f1a.xml', 'f1b.xml'), ('f2a.xml', 'f2b.xml'), ('f3a.xml', 'f3b.xml')]
for f1, f2 in filePairs:
if not filecmp.cmp(f1, f2):
# Files are not equal
out_file.write(f1+'\n')
out_file.close()
你说的是按字节比较还是语义平等? (是否
等于
?)
如果您想检查语义平等性,请查看
在生成xml时,尤其是对属性使用普通dict时,属性顺序可能会混淆,即使有时使用相同的脚本和相同的输入
CPython实现细节:键和值以任意顺序列出,这是非随机的,在Python实现中有所不同,并且取决于字典的插入和删除历史记录
你说的是按字节比较还是语义平等? (是否
等于
?)
如果您想检查语义平等性,请查看
在生成xml时,尤其是对属性使用普通dict时,属性顺序可能会混淆,即使有时使用相同的脚本和相同的输入
CPython实现细节:键和值以任意顺序列出,这是非随机的,在Python实现中有所不同,并且取决于字典的插入和删除历史记录
下面的代码段怎么样:
def separator(self):
return "!@#$%^&*" # Very ugly separator
def _traverseXML(self, xmlElem, tags, xpaths):
tags.append(xmlElem.tag)
for e in xmlElem:
self._traverseXML(e, tags, xpaths)
text = ''
if (xmlElem.text):
text = xmlElem.text.strip()
xpaths.add("/".join(tags) + self.separator() + text)
tags.pop()
def _xmlToSet(self, xml):
xpaths = set() # output
tags = list()
root = ET.fromstring(xml)
self._traverseXML(root, tags, xpaths)
return xpaths
def _areXMLsAlike(self, xml1, xml2):
xpaths1 = self._xmlToSet(xml1)
xpaths2 = self._xmlToSet(xml2)
return xpaths1 == xpaths2
下面的代码段怎么样:
def separator(self):
return "!@#$%^&*" # Very ugly separator
def _traverseXML(self, xmlElem, tags, xpaths):
tags.append(xmlElem.tag)
for e in xmlElem:
self._traverseXML(e, tags, xpaths)
text = ''
if (xmlElem.text):
text = xmlElem.text.strip()
xpaths.add("/".join(tags) + self.separator() + text)
tags.pop()
def _xmlToSet(self, xml):
xpaths = set() # output
tags = list()
root = ET.fromstring(xml)
self._traverseXML(root, tags, xpaths)
return xpaths
def _areXMLsAlike(self, xml1, xml2):
xpaths1 = self._xmlToSet(xml1)
xpaths2 = self._xmlToSet(xml2)
return xpaths1 == xpaths2
多了解一些情况会很有用。您是从文件名列表开始,还是从文件所在的目录开始?您想比较文件是否在文本上完全相同(简单),还是仅仅是xml数据相同(更复杂)?是否要将每个文件与其他文件进行比较,并生成不相同的所有文件对的列表?还是将它们全部比较为一个文件?或者您只是想要一个比较任意两个xml文件的函数吗?我有一对xml文件,我预定义了一个,另一个脚本生成了一个。我想编写一个脚本或函数,它将获取源XML和目标XML的路径,并对它们进行比较。如果两个文件内容相同,则移动到下一个文件对;否则,如果XML内容不相同,则将目标XML路径存储在输出文件中。稍微增加一点上下文将非常有用。您是从文件名列表开始,还是从文件所在的目录开始?您想比较文件是否在文本上完全相同(简单),还是仅仅是xml数据相同(更复杂)?是否要将每个文件与其他文件进行比较,并生成不相同的所有文件对的列表?还是将它们全部比较为一个文件?或者您只是想要一个比较任意两个xml文件的函数吗?我有一对xml文件,我预定义了一个,另一个脚本生成了一个。我想编写一个脚本或函数,它将获取源XML和目标XML的路径,并对它们进行比较。如果两个文件内容相同,则移动到下一个文件对;如果XML内容不相同,则将目标XML路径存储在输出文件中