Python:如何生成"缺少元素的文件"

时间:2017-08-07 17:13:10

标签: python python-3.x list

我在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为列表添加条目来生成第一个列表环。

1 个答案:

答案 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]