我想用python3处理一个非常大的XML文件(>3千兆字节),但问题是XML文件不完整,如下所示:
<country name="Liechtenstein">
<rank>1</rank>
<year>2008</year>
<neighbor name="Austria" direction="E"/>
</country>
<country name="Singapore">
<rank>4</rank>
<year>2011</year>
<neighbor name="Malaysia" direction="N"/>
</country>
<country name="Panama">
<rank>68</rank>
我正在寻找的结果是这样的:
<?xml version="1.0"?>
<data>
<country name="Liechtenstein">
<rank>1</rank>
<year>2008</year>
<neighbor name="Austria" direction="E"/>
</country>
<country name="Singapore">
<rank>4</rank>
<year>2011</year>
<neighbor name="Malaysia" direction="N"/>
</country>
</data>
因此,我必须将标题部分(如下所示)添加到XML文件中:
<?xml version="1.0"?>
<data>
然后,删除XML文件的不完整部分(如下所示):
<country name="Panama">
<rank>68</rank>
最后,将队列部分(如下所示)添加到 XML 文件中:
</data>
所有这些过程都必须由 Python 脚本完成。
感谢您的帮助。
将连续的行读入缓冲区,在完成另一个<country>...</country>
条目后打印并清空缓冲区。
import fileinput
print('<?xml version="1.0"?>n<data>n')
country=[]
for line in fileinput.input():
country.append(line)
if '</country>' in line:
print(''.join(country), end='')
country=[]
print('</data>n')
为了避免在条目之间打印虚假换行符,我使用 end=''
. 如果你想要一个 Python 2 解决方案,Python2 的修复是不同的。
就个人而言,我会用 Awk 写这个,这在涉及此类任务时非常有效。
awk 'BEGIN { print "<?xml version="1.0"?>n<data>" }
{ b = b (b ? ORS : "" ) $0 }
/</country>/ { print b; b=""; }
END { print "</data>" }' country.xml
三元表达式(b ? ORS : "")
是仅在b
不为空时才添加换行符(输出记录分隔符),即避免在第一个成员之前添加换行符。