PDA

View Full Version : [Python]-Esercizio Codice Fiscale


Mulder90
25-10-2010, 17:28
Salve a tutti,
mi sono messo ad imparare Python nel tempo libero e ho scritto questo piccolo script che calcola il codice fiscale.


#Creato da Lorenzo Cinque

cognome = raw_input("Inserire il cognome: ")
nome = raw_input("Inserire il nome: ")
sesso = raw_input("inserire sesso(F o M): ")
data = raw_input("inserire data di nascita (gg/mm/anno): ").split('/')
comune = raw_input("inserire comune di nacita: ")

vocali = "aeiouAEIOU"

mesi = { '01':'A','02':'B','03':'C','04':'D',
'05':'E','06':'H','07':'L','08':'M',
'09':'P','10':'R','11':'S','12':'T'}

controllo = { 0:'A',1:'B',2:'C',3:'D',4:'E',5:'F',
6:'G',7:'H',8:'I',9:'J',10:'K',11:'L',
12:'M',13:'N',14:'O',15:'P',16:'Q',17:'R',
18:'S',19:'T',20:'U',21:'V',22:'W',23:'X',
24:'Y',25:'Z'}

dispari = { '0':1, '1':0, '2':5, '3':7, '4':9, '5':13,
'6':15, '7':17, '8':19, '9':21, 'A':1, 'B':0,
'C':5, 'D':7, 'E':9, 'F':13, 'G':15, 'H':17,
'I':19, 'J':21, 'K':2, 'L':4, 'M':18, 'N':20,
'O':11, 'P':3, 'Q':6, 'R':8, 'S':12, 'T':14,
'U':16, 'V':10, 'W':22, 'X':25, 'Y':24, 'Z':23}

pari = { '0':0, '1':1, '2':2, '3':3, '4':4, '5':5,
'6':6, '7':7, '8':8, '9':9, 'A':0, 'B':1,
'C':2, 'D':3, 'E':4, 'F':5, 'G':6, 'H':7,
'I':8, 'J':9, 'K':10, 'L':11, 'M':12, 'N':13,
'O':14, 'P':15, 'Q':16, 'R':17, 'S':18, 'T':19,
'U':20, 'V':21, 'W':22, 'X':23, 'Y':24, 'Z':25}

def CalcCognome(cognome):
cons = []
voc = []
for x in cognome:
if x in vocali:
voc.append(x)
else:
cons.append(x)
codCognome = "".join(cons + voc +['x']*2)[0:3]
return codCognome.upper()


def CalcNome(nome):
cons = []
voc = []
for x in nome:
if x in vocali:
voc.append(x)
else:
cons.append(x)
if len(cons) > 3:
cons[1:2] = []
codNome = "".join(cons + voc +['x']*2)[0:3]
return codNome.upper()

def Data(data, sesso):
anno = data[2][2:]
mese = mesi[data[1]]
if sesso != "M":
giorno = str(int(data[0]) + 40)
else:
giorno = data[0]
return anno + mese + giorno


def CalcCodComune(comune):
codici = open("codici_catastali.txt", "r")
while 1:
linea = codici.readline().strip()
if not linea:
codici.close()
return 0
com, codice, provincia = linea.split(',')
if com == comune:
codici.close()
return codice.upper()


def CodiceControllo(codFisc):
indice = 0
a = 0
b = 0
p = []
d = []
while indice < len(codFisc):
if indice%2!=0:
p.append(codFisc[indice])
else:
d.append(codFisc[indice])
indice +=1
for x in p:
a += pari[x]
for y in d:
b += dispari[y]
return controllo[((a+b)%26)].upper()


codFisc = CalcCognome(cognome)+CalcNome(nome)+Data(data, sesso)+CalcCodComune(comune)
print codFisc+CodiceControllo(codFisc)


lo script funziona ma se inserisco un cognome o un nome formati da più parole non funziona. es: Del Piero :D
Sapete come posso risolvere?L'unico modo con cui posso inserire i nomi composti è di metterli tutti attaccati ma è un modo un pò naif.
Inoltre sapete dirmi come posso migliorare il codice o se c'è qualcosa che secondo voi non va bene?

Ecco il file con i codici catastali per chi lo volesse provare
http://www.mediafire.com/?9w2men481h21ft9

ingframin
25-10-2010, 20:16
se posti anche un link a dove trovare il file coi codici dei comuni come ce l'hai tu (o me lo mandi per email) riesco a farlo girare e a provarlo per intero.
Comunque ad occhio il problema è questo:

for x in p:
a += pari[x]
for y in d:
b += dispari[y]
return controllo[((a+b)%26)].upper()

Se ci sono degli spazi nel cognome tendi ad usare uno spazio come indice del dizionario.
Puoi risolvere così:

for x in p:
if x == ' ':
continue

a += pari[x]

for y in d:
if x == ' ':
continue
b += dispari[y]

return controllo[((a+b)%26)].upper()
Fammi sapere se va!
Saluti :)

Mulder90
25-10-2010, 20:27
il link per il file dei codici è nel primo post in fondo ;)
Intanto grazie della risposta ,provo subito!

ingframin
25-10-2010, 20:34
Ok, sono rimbambito :stordita:
Comunque col piccolo stratagemma che ti ho suggerito funziona :-)

Mulder90
25-10-2010, 20:34
allora ho provato e adesso non si blocca più però viene una cosa del genere:
AB DEF90G01H123I

ingframin
28-10-2010, 20:38
allora ho provato e adesso non si blocca più però viene una cosa del genere:
AB DEF90G01H123I

dà anche a me lo stesso problema, solo che non ho avuto tempo di metterci mano causa bordelli a lavoro (ieri sono uscito dall'ufficio alle 8 e mezzo :coffee: )
Comunque conto di metterci mano domenica e poi ti faccio sapere!