Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Python - Parsing di file XML di grandi dimensioni
Forum - Python - Parsing di file XML di grandi dimensioni

Avatar
drew (Normal User)
Newbie


Messaggi: 13
Iscritto: 22/03/2011

Segnala al moderatore
Postato alle 9:05
Venerdì, 18/12/2015
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



Codice sorgente - presumibilmente Python

  1. import os
  2.     import re
  3.     import codecs
  4.     import mmap
  5.     from HTMLParser import HTMLParser
  6.    
  7.     DEFAULT_BLOCK_SIZE = 7500
  8.    
  9.    
  10.    
  11.     f = codecs.open("[url="https://dumps.wikimedia.org/itwiki/20151202/"]wiki.xml", "r", "utf-8")
  12.     f_in = mmap.mmap(f.fileno(), 0, access = mmap.ACCESS_READ)
  13.    
  14.     f_out = codecs.open("f_wiki.txt", "w", "utf-8")
  15.     f_control = codecs.open("control.txt", "w", "utf-8")
  16.    
  17.    
  18.    
  19.     end_file = os.stat(f.name).st_size    
  20.     now = 0
  21.     now_2 = 0
  22.     buff = 0
  23.    
  24.    
  25.    
  26.     while now < end_file:
  27.         block = (DEFAULT_BLOCK_SIZE if ((end_file - now) > DEFAULT_BLOCK_SIZE)
  28.                                     else (end_file - now))
  29.    
  30.         buff = f_in.read(block)
  31.        
  32.         start = re.search(r"(<text.+?>)", buff)
  33.    
  34.         if start:
  35.             f_control.write(buff[:start.span()[1]])  
  36.             buff = buff[start.span()[1] :]
  37.             now += block
  38.             now_2 = 0
  39.    
  40.             while True:
  41.                 end = re.search("<\/text>", buff[now_2 :])
  42.    
  43.                 if end:
  44.                     _end = (end.span()[0] + now_2, end.span()[1] + now_2)
  45.                                
  46.                     buff = buff[0 : _end[0]]
  47.                     f_control.write(buff[_end[0] : _end[1]])
  48.                    
  49.                     try:
  50.                         buff = HTMLParser().unescape(buff.decode("utf-8"))
  51.                         f_out.write(buff)
  52.                        
  53.                     except:
  54.                         print("\n\n8 - now: " + str(now) +
  55.                               "\nstart: " + str(start.span()) +
  56.                               " - end: " + str(_end) +
  57.                               "\nblock: " + str(block) +
  58.                               " - block_2: " + str(block_2))
  59.                         raise
  60.                                        
  61.                     finally:
  62.                         now += _end[1]
  63.                         f_in.seek(now, 0)
  64.                         break
  65.    
  66.                 if(now + now_2 < end_file):
  67.                     block_2 = (DEFAULT_BLOCK_SIZE
  68.                                 if ((end_file - now) > DEFAULT_BLOCK_SIZE)
  69.                                 else (end_file - now))
  70.    
  71.                     buff += f_in.read(block_2)
  72.    
  73.                     now_2 += block_2 - 15
  74.    
  75.                 else:
  76.                     now += now_2
  77.                     break                              
  78.                
  79.         else:
  80.             f_in.seek(-50, 1)
  81.             now += block - 50
  82.             f_control.write(buff[0 : (len(buff) - 50)])
  83.             buff = 0
  84.    
  85.    
  86.    
  87.     f_control.flush()    
  88.     f_control.close()
  89.     f_out.flush()
  90.     f_out.close()
  91.     f_in.close()
  92.    
  93.     if not(now == end_file):
  94.         print("Il programma è terminato senza completare l'elaborazione del file!")


Ultima modifica effettuata da drew il 18/12/2015 alle 9:08
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 16:50
Sabato, 19/12/2015

Ultima modifica effettuata da pierotofy il 19/12/2015 alle 16:51


Il mio blog: https://piero.dev
PM Quote