如何使用lxml-Python(从.XML文件)高效地解析特定行?

如何使用lxml-Python(从.XML文件)高效地解析特定行?,python,python-3.x,xpath,lxml,nested-loops,Python,Python 3.x,Xpath,Lxml,Nested Loops,我已经编写了一个代码,可以在XML.file中的特定行上进行迭代,但由于效率低下,我认为这不是一个好的编码。我的example.XML如下所示: <data>0.0, 100.0</data> <data>1.0, 101.0</data> <data>2.0, 102.0</data> <data>3.0, 103.0</data> <data>4.0, 104.0</data&g

我已经编写了一个代码,可以在XML.file中的特定行上进行迭代,但由于效率低下,我认为这不是一个好的编码。我的example.XML如下所示:

<data>0.0, 100.0</data>
<data>1.0, 101.0</data>
<data>2.0, 102.0</data>
<data>3.0, 103.0</data>
<data>4.0, 104.0</data>
<data>5.0, 105.0</data>
<data>6.0, 106.0</data>
<data>7.0, 107.0</data>
<data>8.0, 108.0</data>
<data>9.0, 109.0</data>
<data>10.0, 110.0</data>
那么输出只包括

4.0, 104.0
5.0, 105.0
6.0, 106.0
7.0, 107.0
8.0, 108.0

我已经考虑过是否应该使用iterparse()-方法或其他方法。然而,这表明Xpath是一种很好的方法,但我想我应该重新考虑我的代码。太多的for循环似乎效率低下。是否有人对如何改进此代码有任何建议或提示(或供进一步阅读的链接)?

我不确定它是否更有效,但您肯定可以简化代码:

dat = [your xml above]
import lxml.html #needed to do this to be able to parse from string, not file
tree = lxml.html.fromstring(dat)
简化代码:

data = []
for i in range(5, 10, 1): #since xpath counts from 1, while range counts from zero
    for z in tree.xpath(f'//data[{i}]'): 
                        data.append(z.text) 
检查它是否工作:

 for item in data:
        print(item)
输出:

4.0, 104.0
5.0, 105.0
6.0, 106.0
7.0, 107.0
8.0, 108.0

我不确定它是否更高效,但您肯定可以简化代码:

dat = [your xml above]
import lxml.html #needed to do this to be able to parse from string, not file
tree = lxml.html.fromstring(dat)
简化代码:

data = []
for i in range(5, 10, 1): #since xpath counts from 1, while range counts from zero
    for z in tree.xpath(f'//data[{i}]'): 
                        data.append(z.text) 
检查它是否工作:

 for item in data:
        print(item)
输出:

4.0, 104.0
5.0, 105.0
6.0, 106.0
7.0, 107.0
8.0, 108.0

我做了一些测试。我的原始文件包含数万行,我只需要从400行中获取数据,所以我在测试中使用了它。这个例子太简单了,找不出任何区别

上面提到的简化方法实际上纠正了我的代码,因为它有错误。纠正和简化代码(答案)的求解时间为
3.0-3.5秒

但是,我刚刚找到了另一种方法,它只包含一个循环:

data = []          
for z in tree.xpath('//data[position()>=4 and position()<=8]'): 
    data.append(z.text)
data=[]

对于tree.xpath('//data[position()>=4和position()中的z,我做了一些测试。我的原始文件包含数万行,我只需要从400行中获取数据,所以我在测试中使用了它。所给出的示例太简单,无法找到任何差异

上面提到的简化方法实际上修正了我的代码,因为它有错误。修正和简化代码(答案)的求解时间为
3.0-3.5秒

但是,我刚刚找到了另一种方法,它只包含一个循环:

data = []          
for z in tree.xpath('//data[position()>=4 and position()<=8]'): 
    data.append(z.text)
data=[]
对于tree.xpath('//data[position()>=4和position())