User:Alex brollo/Python scripts

From Wikisource
Jump to navigation Jump to search
# -*- coding: cp1252 -*-
import pickle, htmlentitydefs
# si rende disponibile un vocabolario entitydefs: entità HTML->carattere
global pagine,entitydefs

def estrai(xmlfile): #senza estensione: per indicare il file colombodjvu.xml scrivere colombodjvu
    f=open(xmlfile+".xml")
    xml=unicode(f.read(),"utf-8") # tutto il file viene letto in una stringa che vciene codificata in Unicode
    #xml=post_el(xml)
    f.close()
    #elimino eventuali doppie quadre
    
    pagine=estrai_elementi(xml,"OBJECT") # ogni pagina è contenuta fra tag OBJECT. Viene creata una lista di pagine "grezze"
    
    for i in range(len(pagine)):
        pagine[i]=estrai_testo_pagina(pagine[i]) #pagina per pagina si estrae il testo

    pagine[0:0]=" "                              #si aggiunge in testa una pagina[0] per allineare gli indici con i numeri pagina
    
    txt=""
    
    for i in range(len(pagine)):
        print i, 

        pagine[i]=post_el(pagine[i]) # si esegue postelaborazione sulle pagine in Unicode
        txt=txt+"["+str(i)+"]"+pagine[i].encode("cp1252","ignore")+"[/"+str(i)+"]"  #si aggiungono i tag di inizio e fine pagina
                                                                                    # e si codifica in cp1252    
    salva_pcl(pagine,xmlfile) # si salva come lista in nomefile.pcl
    salva(txt,xmlfile) # e come testo txt in nomefile.txt
    
    
    print "Fine programma. Le pagine sono salvate come lista qui: "+xmlfile+\
    '\nPer caricare il file usare il comando p=carica_pcl(NomeFileSenzaEstensione)'
    return pagine

    
def post_el(testo):
    #print "Sostituisco html entities"
    testo=entities2txt(testo)

    #trasformo i > in virgole
    testo=testo.replace(">",",")
    testo=testo.replace("^","'")
    testo=testo.replace(u"»",",")
    testo=testo.replace(u"•",".")

    #elimino eventuali quadre
    testo=testo.replace("[","(")
    testo=testo.replace("]",")")
    #print "Aggiusto gli apostrofi..."
    
    testo=testo.replace(u"'",u"’")
    
    #print "Sistemo gli spazi..."
    testo=spazi(testo)
        
    #print "Riunisco le parole spezzate..."
    testo=spezzate(testo)

    return testo
    
def entities2txt(testo):
    testo=testo.replace("<","<")
    testo=testo.replace(">",">")
    testo=testo.replace("&","&")
    testo=testo.replace(""",'"')

    return testo
    

def spezzate(x):
    x.replace("- \n","-\n")
    while "-\n" in x:
        ptrattino=x.find("-\n")
        pcaratt=ptrattino+2
        while pcaratt < len(x):
            if x[pcaratt:pcaratt+1].isalpha():
                break
            else:
                pcaratt=pcaratt+1
        pparola=ptrattino-2
        while True:
            if x[pparola-1:pparola].isalpha():
                pparola=pparola-1
            else:
                break
        x=x[:pparola]+"\n"+x[ptrattino+2:pcaratt]+x[pparola:ptrattino]+x[pcaratt:]
    return x
            

def salva_pcl(variabile,nome_file="dato"):
    nome_file=nome_file+".pcl"
    f=open(nome_file,"w")
    pickle.dump(variabile, f)
    f.close()

    print "Variabile salvata nel file "+nome_file
    return

# loads a variable
def carica_pcl(nome_file):
    nome_file=nome_file+".pcl"
    f=open(nome_file)
    contenuto=pickle.load(f)
    f.close()
    return contenuto


def spazi(t):
    for i in ".,;!?:":
        t=t.replace(" "+i,i+" ")
    t=t.replace("  "," ")
    
    t=t.replace(u" ’",u"’")
    t=t.replace(u"’ ",u"’")
    for i in [u"o’",u"a’",u"i’",u"u’", u"e’"]:
        t=t.replace(i,i+" ")
    
    return t

def estrai_txt(file_input):
    file_input=file_input+".txt"
    f=open(file_input)
    fi=f.read()
    f.close()
    p=[]
    p.append(" ")
    pagenum=1
    while True:
        tagi="["+str(pagenum)+"]"
        tagf="[/"+str(pagenum)+"]"
        if fi.find(tagi)>-1 and fi.find(tagf)>-1:
            fi,page=el_st(fi,tagi,tagf)
            p.append(page)
            pagenum=pagenum+1
            print pagenum,
        else:
            break
    p=elimina_numero_righe(p)
    p=elimina_prima_riga(p)
    p=aggiungi_header_footer(p)
    r=" "
    while not r in "fF":
        r=raw_input("pagina: numero; e=elimina prima riga; f: fine.")
        if r.isdigit():
            print p[eval(r)]
        
        
    return p

def aggiungi_header_footer(lista):
    header='''<noinclude>{{PageQuality|1|Alebot}}<div class="pagetext">

</noinclude>'''
    footer='''<noinclude>
<references/></div></noinclude>'''
    for i in range(len(lista)):
        lista[i]=header+lista[i]+footer
    return lista

def elimina_prima_riga(lista):
    for i in range(len(lista)):
        acapo=lista[i].find("\n")
        lista[i]=lista[i][acapo:].strip()
        
    return lista

def elimina_numero_righe(lista):
    for i in range(len(lista)):
        lista[i]=lista[i].replace("["+str(i)+"]","")
        lista[i]=lista[i].replace("[/"+str(i)+"]","")
    return lista

        
    
    

def apri(f):
    
    fi=open(f)
    t=fi.read()
    fi.close()
    print "letto file", f
    return t

def salva(t,f):
    f=f+".txt"
    fo=open(f,"w")
    fo.write(t)
    fo.close()
    print "Salvato su",f
    return


# looks for the first substring beginning with idi and ending with ifd and returns it with or without (default) delimiters
def find_stringa(stringa,idi,idf,dc=0):
    idip=stringa.find(idi)
    idfp=stringa.find(idf,idip)+len(idf)
    if idip>-1 and idfp>0:
        if dc==0:
            vvalore=stringa[idip+len(idi):idfp-len(idf)]
        else:
            vvalore=stringa[idip:idfp]
    else:
        vvalore=""
    return vvalore

# extracts the first substring (beginning with idi and ending with idf)
# from a string; replaces the substring with new (default empty string); returns the replaced main string and te substring

def el_st(stringa,idi,idf,new=""):
    idip=stringa.find(idi)
    idfp=stringa.find(idf,idip)+len(idf)
    if idip>-1 and idfp>0:
        vvalore=stringa[idip:idfp]
        valore=stringa.replace(vvalore,new,1)
    else:
        vvalore=""
        valore=stringa
    return valore, vvalore

# returns a list of all substrings (beginning with idi and ending with idf)
# of a string; ; used for xml data managing too

def produci_lista(testo,idi,idf,dc=0):
    t=testo[:]
    lista=[]
    while not find_stringa(t,idi,idf)=="":
        el=find_stringa(t,idi,idf,1)
        t=t.replace(el,"")
        #print el
        if dc==0:
            el=find_stringa(el,idi,idf,0)
        #print el
        #print
        lista.append(el)
    return lista

### XML parsing routines

def estrai_elementi(codice,tag):
    tag1="<"+tag
    tag2="</"+tag+">"
    lista=produci_lista(codice,tag1,tag2,1)
    for i in range(len(lista)):
        lista[i]=el_st(lista[i],tag1,">")[0]
        lista[i]=lista[i].replace(tag2,"")
    return lista

def estrai_testo_pagina(pagina):
    lista_paragrafi=estrai_elementi(pagina,"PARAGRAPH")
    for i in range(len(lista_paragrafi)):
        lista_linee=estrai_elementi(lista_paragrafi[i],"LINE")
        for j in range(len(lista_linee)):
            lista_linee[j]=estrai_elementi(lista_linee[j],"WORD")
            lista_linee[j]=" ".join(lista_linee[j])            
        lista_paragrafi[i]="\n".join(lista_linee)+"\n"
    #testo_pagina=unicode("\n".join(lista_paragrafi).replace("'","'"),"utf-8")
    testo_pagina="\n".join(lista_paragrafi).replace("'","'")
    return testo_pagina