2011-09-24 41 views
0

我有一个下面的python 3脚本,应该下载一个xml文件并将其分成只有500个项目的较小文件。我有两个问题:XML中的最后一个元素没有被拾起

  1. 原始的XML最后一个项目是不存在拆分文件
  2. 如果原始的XML为1000个条目它会创建一个空的3 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') 

回答

1

第二个是没有错误,但通过设计。在读取1000个元素之后,迭代器还不知道没有其他项目,因此继续循环while True

如果迭代器会有hasNext,那么你可以用while hasNext来替代它以解决这个问题。不幸的是python中没有这样的东西。

对于第一个问题:目前我看不到任何代码解释此问题。

+0

非常感谢您的帮助 – Milo

相关问题