【问题标题】:Last element in xml not getting picked upxml中的最后一个元素没有被拾取
【发布时间】:2011-11-24 07:22:57
【问题描述】:

我在下面有一个 python 3 脚本,它应该下载一个 xml 文件并将其拆分为较小的文件,每个文件只有 500 个项目。我有两个问题:

  1. 原始 xml 中的最后一项在拆分文件中不存在
  2. 如果原始 xml 的长度为 1000 项,它将创建第三个空 xml 文件。

谁能告诉我代码中哪里可能存在这样的错误导致这些症状?

import urllib.request as urllib2
from lxml import etree

def _yield_str_from_net(url, car_tag):

    xml_file = urllib2.urlopen(url)
    for _, element in etree.iterparse(xml_file, tag=car_tag):
        yield etree.tostring(element, pretty_print=True).decode('utf-8')
        element.clear()

def split_xml(url, car_tag, save_as):

    output_file_num = 1
    net_file_iter = _yield_str_from_net(url, car_tag)
    while True:
        file_name = "%s%s.xml" % (save_as, output_file_num)
        print("Making %s" % file_name)
        with open(file_name, mode='w', encoding='utf-8') as the_file:
            for elem_count in range(500):    # want only 500 items
                try:
                    elem = next(net_file_iter)
                except StopIteration:
                    return
                the_file.write(elem)
                print("processing element #%s" % elem_count)
        output_file_num += 1

if __name__ == '__main__':
    split_xml("http://www.my_xml_url.com/",
              'my_tag',
              'my_file')

【问题讨论】:

    标签: python-3.x lxml


    【解决方案1】:

    第二个不是错误,而是设计使然。读取 1000 个元素后,迭代器还不知道没有其他元素,因此继续 while True 循环。

    如果迭代器有hasNext 那就太好了,然后你可以用while hasNext 替换它来解决这个问题。不幸的是,python中没有这样的东西。

    对于第一个问题:目前我在您的代码中看不到任何解释此问题的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多