我在xml中有一组数据,类似于:
<widgets>
<widget number = 'a1'>
...
info regarding widget a1
...
</widget>
<widget number = 'a2'>
...
info regarding widget a2
...
</widget>
...
...
...
<widget number = 'a10000000000000000'>
...
info regarding widget a10000000000000000
...
</widget>
</widgets>
我正在解析文件,查找每个小部件的信息,这很好。
我正在寻找一种方法来制作一个csv&#34;缺失&#34;小部件。它们是按数字顺序排列的(即,a2应该跟随a1,a3跟随a2等),但可能会有一些缺失。
我已经到了需要剥离&#39; a&#39;离开前面,但我不知道如何设置一些东西,如果有一个&#34;跳过&#34;,一切都被添加到&#34;跳过&#34;文件。
也许,通过一个例子可以更容易地说明这一点。如果我有: ... ... ... ... 有关小部件a10的信息 ... ... 有关小部件a12的信息 ... ... ... ... 我想要一个带有&#39; a11&#39;的列表,因为那是丢失的列表。
如果我有: ... ... ... ... 有关小部件a17的信息 ... ... 有关小部件a20的信息 ... ... ... ... 我想要一个清单 A18 A19
等等。我知道如何将列表导入csv,所以我真正想要的是如何通过确定跳过,评估跳过的大小然后使用for为列表添加条目来生成第一个列表环。
答案 0 :(得分:1)
首先,我创建一个带有一些间隙的小部件的xml文件。然后我使用lxml库解析它,并使用xpath表达式查找widget
元素的集合。我从每个元素中选择number
属性,然后在列表推导中包含数字的切片,以获得所有available_widgets
的数字。
此时我采取了懦夫的方法:我认为可能的小部件数量范围很小。我旋转了available_widgets
所代表的范围,看看哪些遗失了。
事实上,如果你需要查看各种各样的可能性,那么你很可能会找到一个方法来在SO的某处找到列表或序列中的空白。
>>> nums = [1,2,3,5,6,8,11,14,17,20]
>>> with open('temp.xml', 'w') as temp:
... r = temp.write('<widgets>')
... for num in nums:
... r = temp.write('<widget number="a%s">'%num)
... r = temp.write('info regarding widget a%s'%num)
... r =temp.write('</widget>')
... r = temp.write('</widgets>')
...
>>>
>>> from lxml import etree
>>> tree = etree.parse('temp.xml')
>>> widgets = tree.xpath('.//widget')
>>> available_widgets = [int(widget.attrib['number'][1:]) for widget in widgets]
>>> available_widgets
[1, 2, 3, 5, 6, 8, 11, 14, 17, 20]
>>> missing_widgets = []
>>> for num in range(min(available_widgets), max(available_widgets)+1):
... if not num in available_widgets:
... missing_widgets.append(num)
...
>>> missing_widgets
[4, 7, 9, 10, 12, 13, 15, 16, 18, 19]