Utente:Divudi85/Python/fixOCR.py
Aspetto
< Utente:Divudi85 | Python
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re,sys,pickle # importo i moduli re (regex), sys (necessario per l'eventuale passaggio parametri da riga di comando),
# pickle (permette di salvare su file qualsiasi variabile anche complessa)
from os import system # da os (routine per interfaccia con il sistema operativo) importo system (che serve per lanciare un programma esterno
# come se si operasse dalla riga di comando: ci serve per lanciare routine djvuLibre su file djvu
# Questa funzione accetta il nome di un djvu, ne estrae il testo in formato "dsed", ossia in blocchi sempre più piccoli fino al livello word
# (singole parole), e permette di applicare a ogni singola parola una funzione di modifica repl().
# La seconda parte del programma usa il file dsed modificato e lo rificca dentro il file djvu.
def dsedEdit(djvu):
comando='djvused -u %s -e "select; output-txt" > input.dsed' % (djvu) # preparo la riga di comando da inviare al sistema operativo
res=system(comando) # la lancio; il comando estrae il testo e lo salva in input.dsed (file testo uft-8)
if res != 0: # verifica eventuale errore
print "errore nella generazione input.dsed"
return
r=re.compile(r'(word \d+ \d+ \d+ \d+ ")(.+)("[)]+)$') # preparo la regex per isolare dalle righe word il testo
l=unicode(open("input.dsed").read(),"utf-8").split("\n") # apro input.dsed, lo leggo, lo trasformo in unicode, lo divido in una lista di righe
for i in range(len(l)): # scorro tutta la lista....
if "(word " in l[i]: # se la riga contiene (word ....
x=r.findall(l[i])[0] # scateno la regex; se tutto va bene mi restituisce una lista di tre elementi, quello centrale è il testo
# della singola word (parola).
old="".join(x) # memorizzo la vecchia stringa costituita dalla lista
if len(x)==3: # se tutto va bene...
x1=repl(x[1]) # lancio la funzione repl sull'elemento centrale x[1]
l[i]=l[i].replace(old,x[0]+x1+x[2]) # e sostituisco, nella riga, la stringa "vecchia" con quella modificata
open("output.dsed","w").write(("\n".join(l)).encode("utf-8")) # salvo il tutto in output.desd
comando='djvused %s -f output.dsed -s' % (djvu) # preparo il comando per ficcare il nuovo testo nel djvu
res=system(comando) # lo lancio....
if res != 0: # verifico eventuali errori di sistema...
print "errore nel montaggio di output.dsed"
return
return "fatto" # finito.
# funzione di trasformazione : può essere qualsiasi, una serie di replace, una serie di regex.....
def repl(testo): # riceve una parola...
testo=testo.upper() # la modifica ....
return testo # la restituisce modificata
### pickle utilities
def carica_pcl(nome_file, folder="dati/"):
nome_file=folder+nome_file+".pcl"
f=open(nome_file)
contenuto=pickle.load(f)
f.close()
return contenuto
def salva_pcl(variabile,nome_file="dato",folder="dati/"):
nome_file=folder+nome_file+".pcl"
f=open(nome_file,"w")
pickle.dump(variabile, f)
f.close()
print "Variabile salvata nel file "+nome_file
return
### find_stringa() and produci_lista
def find_stringa(stringa,idi,idf,dc=0,x=None,side="left"):
if side=="right":
idip=stringa.rfind(idi)
else:
idip=stringa.find(idi)
idfp=stringa.find(idf,idip+len(idi))+len(idf)
if idip>-1 and idfp>0:
if x!=None:
while stringa[idip:idfp].count(x)>stringa[idip:idfp].count(idf):
if stringa[idip:idfp].count(x)>stringa[idip:idfp].count(idf):
idfp=stringa.find(idf,idfp)+len(idf)
if dc==0:
vvalore=stringa[idip+len(idi):idfp-len(idf)]
else:
vvalore=stringa[idip:idfp]
else:
vvalore=""
return vvalore
def produci_lista(testo,idi,idf,dc=1,inizio=None):
t=testo[:]
lista=[]
while not find_stringa(t,idi,idf,1,inizio)=="":
el=find_stringa(t,idi,idf,1,inizio)
t=t.replace(el,"",1)
if dc==0:
el=find_stringa(el,idi,idf,0,inizio)
lista.append(el)
return lista
##
##def main(params):
## leggi(params[1],params[2])
## dsed()
## return
##if __name__ == "__main__":
##
## djvu=sys.argv
## main(djvu)