如何分割大型维基百科垃圾。xml.bz2Python文件?

2024-06-11 08:13:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用wikimedia转储文件(。xml.bz2)使用Python。我从this文章开始作为指南。它涉及多种语言,我想把所有的步骤组合成一个单独的python项目。我找到了这个过程所需的几乎所有库。现在唯一的困难是有效地分割大的。xml.bz2在搜索操作期间,将文件分为多个较小的文件,以便更快地进行分析。在

我知道python中存在bz2库,但它只提供压缩和解压缩操作。但是我需要一些类似于bz2recover从命令行执行的操作,它将大文件拆分成许多较小的垃圾。在

更重要的一点是,拆分不应分割已压缩的xml文档中以<page>开头、以</page>结尾的页面内容。在

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

注意:我想使结果包跨平台兼容,因此不能使用操作系统特定的命令。在


Tags: 文件项目代码命令行过程文章page指南
3条回答

最后我自己写了一个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')

好吧,如果您有一个命令行工具可以提供您想要的功能,那么您总是可以使用subprocess模块将其包装在一个调用中

您所引用的方法是一个相当肮脏的黑客:)

我编写了一个离线Wikipedia工具,Sax完全解析了这个转储文件。如果您只需将未压缩的xml从适当的bzip2解压器导入stdin,那么吞吐量是可用的。尤其是如果它只是一个巫术。在

作为一种简单的测试方法,我只需压缩每个页面并将其写入一个大文件,并将偏移量和长度保存在cdb(small key-value store)中。这可能是一个有效的解决方案。在

请记住,mediawiki标记是我很长时间以来遇到的最可怕的sh*t。但如果是巫术的话,我也许可以处理。在

相关问题 更多 >