我正在尝试阅读一堆xml文件并对其进行处理。我想要做的第一件事是根据文件中的数字重命名它们。
您可以看到数据样本here 警告这将开始下载108MB的zip文件!。这是一个巨大的xml文件,里面有成千上万个较小的xml文件。我已将它们分解为单个文件。我想根据内部的数字重命名文件(预处理的一部分)。我有以下代码:
from __future__ import print_function
from bs4 import BeautifulSoup # To get everything
import os
def rename_xml_files(directory):
xml_files = [xml_file for xml_file in os.listdir(directory) ]
for filename in xml_files:
filename = filename.strip()
full_filename = directory + "/" +filename
print (full_filename)
f = open(full_filename, "r")
xml = f.read()
soup = BeautifulSoup(xml)
del xml
del soup
f.close()
如果我注释掉“汤=”和“del”系列,那就完美了。如果我添加“汤= ...”行,它将工作片刻,然后它最终会废弃 - 它只是崩溃了python内核。我正在使用Enthought Canopy,但我已经尝试从命令行运行它并且也在那里疯狂。
我想,也许,它没有为变量“汤”释放空间,所以我尝试添加“del”命令。同样的问题。
有关如何规避此事的任何想法?我不是坚持BS。如果有更好的方法,我会喜欢它,但我需要一些示例代码。
答案 0 :(得分:2)
尝试使用Python标准{{1}}库中的{{1}}而不是BeautifulSoup。 '汤非常适合解析普通网页,但是cElementTree非常快。
像这样:
{{1}}
如果您的XML格式正确,则应解析它。如果您的机器仍然无法处理内存中的所有数据,您应该查看streaming XML。
答案 1 :(得分:0)
我不会将该文件分成许多小文件,然后再处理它们,我会一次性处理它们。
我只需使用streaming
api XML解析器并解析主文件,获取名称并使用正确的名称写出子文件一次。
不需要BeautifulSoup,它主要用于处理HTML并使用文档模型而不是流解析器。
为了一次性获取单个元素,您无需构建整个DOM。