Oppure

Loading
18/12/15 8:05
drew
Ciao, ho scritto qualche riga di codice per estrarre tutti i testi, all'interno dei tags <text> dal dump XML di wikipedia.

Normalmente, sarebbe più comodo usare BeautifulSoup o ElementTree, ma dovendo lavorare con un file da 15 GB, dovrei comunque completare il codice, per gestire blocchi di dati piccoli, quindi ho rifatto tutto.

Funziona in parte, perché estrae correttamente il testo da circa la metà dei tags <text> presenti nel file (ho controllato la dimensione dei file f_out e f_control) e non sono ancora riuscito a correggere l'errore.


Suggerimenti? :D:D:D



    import os
    import re
    import codecs
    import mmap
    from HTMLParser import HTMLParser
    
    DEFAULT_BLOCK_SIZE = 7500
    
    
    
    f = codecs.open("[url="https://dumps.wikimedia.org/itwiki/20151202/"]wiki.xml", "r", "utf-8")
    f_in = mmap.mmap(f.fileno(), 0, access = mmap.ACCESS_READ)
    
    f_out = codecs.open("f_wiki.txt", "w", "utf-8")
    f_control = codecs.open("control.txt", "w", "utf-8")
    
    
    
    end_file = os.stat(f.name).st_size     
    now = 0
    now_2 = 0
    buff = 0
    
    
    
    while now < end_file:
        block = (DEFAULT_BLOCK_SIZE if ((end_file - now) > DEFAULT_BLOCK_SIZE)
                                    else (end_file - now))
    
        buff = f_in.read(block)
    	
        start = re.search(r"(<text.+?>)", buff)
    
        if start:
            f_control.write(buff[:start.span()[1]])  
            buff = buff[start.span()[1] :]
            now += block
            now_2 = 0
    
            while True:
                end = re.search("<\/text>", buff[now_2 :])
    
                if end:
                    _end = (end.span()[0] + now_2, end.span()[1] + now_2)
    				
                    buff = buff[0 : _end[0]]
                    f_control.write(buff[_end[0] : _end[1]]) 
                    
                    try:
                        buff = HTMLParser().unescape(buff.decode("utf-8"))
                        f_out.write(buff)
                        
                    except:
                        print("\n\n8 - now: " + str(now) +
                              "\nstart: " + str(start.span()) + 
                              " - end: " + str(_end) +
                              "\nblock: " + str(block) + 
                              " - block_2: " + str(block_2))
                        raise
    					
                    finally:
                        now += _end[1]
                        f_in.seek(now, 0)
                        break
    
                if(now + now_2 < end_file):
                    block_2 = (DEFAULT_BLOCK_SIZE
                                if ((end_file - now) > DEFAULT_BLOCK_SIZE)
                                else (end_file - now))
    
                    buff += f_in.read(block_2)
    
                    now_2 += block_2 - 15
    
                else:
                    now += now_2
                    break				
               
        else:
            f_in.seek(-50, 1)
            now += block - 50
            f_control.write(buff[0 : (len(buff) - 50)])
            buff = 0
    
    
    
    f_control.flush()    
    f_control.close()
    f_out.flush()
    f_out.close()
    f_in.close()
    
    if not(now == end_file):
    	print("Il programma è terminato senza completare l'elaborazione del file!")
Ultima modifica effettuata da drew 18/12/15 8:08
aaa
19/12/15 15:50
pierotofy
Ultima modifica effettuata da pierotofy 19/12/15 15:51
Il mio blog: piero.dev