用python外推差异

时间:2013-10-29 11:14:43

标签: python typeerror difflib

我正在使用一个库来推断两个json文件之间的差异。我的代码将它们加载到字典中,然后使用datadiff来获取两个数据结构之间的差异。问题是我想进一步处理输出:

datadiff.diff

制作在两个数据结构中找到的差异的html。为了做到这一点,我必须处理命令的输出并将其划分为行。然后,如果行以+开头,我知道输出必须被引用到比较的第二个文件,如果行开头 - 那么我必须将它归因于第一个文件。 mycode的:

    out = datadiff.diff(t[0].get("key"),t[1].get("key"))
    for line in out:
        if str(line).startswith("+"):
            f.write(str(line)+"<br/>")
        if str(line).startswith("-"):
            f.write(str(line)+"<br/>")

这段代码给我一个TypeError:

for line in out:
TypeError: 'DataDiff' object is not iterable

我可以在一个字符串中转换整个datadiff.diff但是我必须以某种方式拆分它以获得所有的行,因为它被转换为单行字符串:

         out = str(datadiff.diff(t[0].get("key"),t[1].get("key")))+"<br/>"

Datadiff输出:

diff in key:
--- a
+++ b
[
@@ -0,1 +0,1 @@
-{u'origin': u'NORMAL', u'score': 100, u'type': u'FEELINGS', u'name': u'sentiment negativo', u'children': [u'reato']},
 {u'origin': u'NORMAL', u'score': 100, u'type': u'FEELINGS', u'name': u'sentiment neg', u'children': [u'reato']},
+{u'origin': u'NORMAL', u'score': 50, u'type': u'FEELINGS', u'name': u'sentiment negativo', u'children': [u'reato']},
]

1 个答案:

答案 0 :(得分:2)

您可以查看source for the DataDiff.stringify() method,您可以在其中查看如何从.diffs列表生成输出:

def output(ddiff, f, depth=0):
    for change, items in out.diffs:
        if change in ('insert', 'delete'):
            prefix = '-' if change == 'delete' else '+'
            for line in items:
                f.write('{}{}{}<br/>'.format(prefix, depth * ' ', line))
        elif change == 'datadiff':
            output(items, f, depth + 1)
            f.write(',')

output(out, f)

如果您只想使用字符串输出,请使用str.splitlines()再次获得单独的行:

for line in str(out).splitlines():
    # etc.