如何在Python中拆分大型wikipedia转储.xml.bz2文件?

4 python xml mediawiki

我正在尝试使用Python使用维基媒体转储文件(.xml.bz2)构建离线wiki.我从这篇文章开始作为指南.它涉及多种语言,我想将所有步骤组合为一个单独的python项目.我找到了该过程所需的几乎所有库.现在唯一的问题是将大型.xml.bz2文件有效地拆分成多个较小的文件,以便在搜索操作期间更快地解析.

我知道bz2库存在于python中,但它只提供压缩和解压缩操作.但我需要一些可以bz2recover通过命令行执行类似操作的操作,它可以将大文件拆分为多个较小的垃圾箱.

另一个重要的一点是拆分不应该拆分以压缩的xml文档开头<page>和结尾的页面内容</page>.

是否有一个以前可用的库可以处理这种情况或者代码必须从头开始编写?(任何大纲/伪代码都会非常有用).

注意:我想使得生成的包跨平台兼容,因此无法使用特定于OS的命令.

小智 12

最后我自己编写了一个Python脚本:

import os
import bz2

def split_xml(filename):
    ''' The function gets the filename of wiktionary.xml.bz2 file as  input and creates
    smallers chunks of it in a the diretory chunks
    '''
    # Check and create chunk diretory
    if not os.path.exists("chunks"):
        os.mkdir("chunks")
    # Counters
    pagecount = 0
    filecount = 1
    #open chunkfile in write mode
    chunkname = lambda filecount: os.path.join("chunks","chunk-"+str(filecount)+".xml.bz2")
    chunkfile = bz2.BZ2File(chunkname(filecount), 'w')
    # Read line by line
    bzfile = bz2.BZ2File(filename)
    for line in bzfile:
        chunkfile.write(line)
        # the </page> determines new wiki page
        if '</page>' in line:
            pagecount += 1
        if pagecount > 1999:
            #print chunkname() # For Debugging
            chunkfile.close()
            pagecount = 0 # RESET pagecount
            filecount += 1 # increment filename           
            chunkfile = bz2.BZ2File(chunkname(filecount), 'w')
    try:
        chunkfile.close()
    except:
        print 'Files already close'

if __name__ == '__main__':
    # When the script is self run
    split_xml('wiki-files/tawiktionary-20110518-pages-articles.xml.bz2')
Run Code Online (Sandbox Code Playgroud)