User:Alex brollo/Python scripts

import pickle, htmlentitydefs global pagine,entitydefs
 * 1) -*- coding: cp1252 -*-
 * 1) si rende disponibile un vocabolario entitydefs: entità HTML->carattere

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("&lt;","<") testo=testo.replace("&gt;",">") testo=testo.replace("&amp;","&") testo=testo.replace("&quot;",'"')

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

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

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='''

   footer= '''   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

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
 * 1) looks for the first substring beginning with idi and ending with ifd and returns it with or without (default) delimiters


 * 1) extracts the first substring (beginning with idi and ending with idf)
 * 2) 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


 * 1) returns a list of all substrings (beginning with idi and ending with idf)
 * 2) 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


 * 1) XML parsing routines

def estrai_elementi(codice,tag): tag1="<"+tag tag2="" 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("&apos;","'"),"utf-8") testo_pagina="\n".join(lista_paragrafi).replace("&apos;","'") return testo_pagina