1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
import csv
str_bidon= '&' #limites de cellules
str_alias= '@' #pour les faute d'orthographe
class DictCsv:
"""
gestion de données de fichier csv par dictionnaire
la 1ère ligne du fichier contient les titres des colonnes
la 1ère colonne contient les clés (uniques)
les autres colonnes sont les valeurs retournées sous forme de liste
récupération des noms mal orthographiés:
la clé est précédée d'"@" et la valeur porte le nom correct
"""
titre= []
liste= {}
def __init__(self):
titre= []
liste= {}
def chargedict(self, fichier):
fichin= csv.reader(open(fichier), dialect='excel',\
delimiter=' ', quotechar='|', quoting= csv.QUOTE_MINIMAL)
D= []
for idx in fichin:
l= " ".join(idx) # on zappe "['" et "'])
l= l.replace('"', '') # on zappe les '"' de la ligne
l= l.split(',') #on découpe la chaine en x mots en zappant les ","
if l[0]== "":
break
D.append(l)
self.titre= D[0]
#print(self.titre)
del D[0]
del self.titre[0] # contient "commune"
for idx in D:
self.liste[normalise(idx[0])]= idx[1:]
def ligne_titres(self):
ligne= [str_bidon, 'commune']
for idx in range(len(self.titre)):
ligne.append(self.titre[idx])
ligne.append(str_bidon)
return(','.join(ligne))
def ligne_dico(self, idx):
ligne= [str_bidon]
ligne.append(idx)
L= self.liste[idx]
for i in range(len(L)):
ligne.append(L[i])
ligne.append(str_bidon)
#print(ligne)
return(','.join(ligne))
def sauvedict(self, fichier):
fichout= csv.writer(open(fichier, 'w'), dialect='excel', delimiter=' ',\
quotechar= '|', lineterminator= "\n", quoting= csv.QUOTE_MINIMAL)
fichout.writerow([self.ligne_titres()])
for idx in self.liste:
fichout.writerow([self.ligne_dico(idx)])
def cherche_liste(self, nom):
try:
L=self.liste[nom]
except:
nom= str_alias + nom
try:
L=self.liste[nom]
if L== []:
return []
alias= L[0]
L=self.liste[normalise(alias)]
return L
except:
L= []
L= []
return L
def replace_liste(self, nom, nelleliste):
try:
self.D[nom]= nelleliste
except:
return
import re
patternes_invariants= [
['[à|â|ä|à]', 'a'],
['[é|è|ê|ë]', 'e'],
['î|ï]', 'i'],
['[ô|ö]', 'o'],
['[ù|û|ü]', 'u'],
[r'\bvx\b', 'vieux'],
[r'\bs/s\b', 'sous'],
['s/', 'sur'] #ici pas de car d'echapement
]
patternes_variants= [
[r'\bste?s?\b', 'st', 'saint'],
[r'\bhte?s?\b', 'ht', 'haut'],
[r'\bgde?s?\b', 'gd', 'grand'],
[r'\bptes?\b', 'pte', 'porte'],
[r'\bmts?\b', 'mt', 'mont'],
[r'\bchtx?\b', 'cht', 'chateau']
]
def normalise(s):
"""
but de la chose:
retourner de noms de communes formatté:
majuscules, sans accent, sans abréviation,
les noms composés sont séparés par des tirets
"""
tmp= s.lower()\
.replace('-', ' ')
for i in patternes_invariants:
tmp= re.sub(i[0], i[1], tmp)
l= tmp.split()
j= []
for i in l:
trouve= 0
for k in patternes_variants:
if re.match(k[0], i):
j.append(i.replace(k[1], k[2]))
trouve= 1
break
if trouve== 0:
j.append(i)
return('-'.join(j)\
.upper())
if __name__== '__main__':
communes= [
'St Leger près Troyes',
'Ste Maure',
'fouchères',
'monmartin le ht',
'virey s/s bar',
'bar s/ seine',
'celles s/-bar s/ seine',
'brienne - le cht',
'noë lès mallets',
'St-Maurice',
'Stains',
'Brest',
"l'Etape",
'le gd vx st s/s la pte du mt du ht cht',
'les gdes vielles stes s/s les ptes des mts des hts chtx']
for i in communes:
print(i, '\t', normalise(i)) |
Partager