Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

accents

8 réponses
Avatar
michel
bonjours,
Dans un gros fichier texte je souhaite mettre en majuscule des noms
situés après une balise ( il s'agit d'un fichier "gedcom" utilisé en
généalogie).
j'ai écrit le script suivant:

===========================
#!/usr/bin/python
# -*- coding: utf-8 -*-

#à partir du gedcom gramps "Unchangeed_1.ged"
#je passe les patronymes en majuscule

#sauver le nouveau fichier en new.ged

import os, string ,re

#fichier à lire
lire='/home/michel/0_genealogie_en_cours/programme-genealogie/nom_en_majuscule/Untitled_1.ged'

#compile les expressions regulieres '2 SURN 'est la balise en debut de ligne
change=re.compile(r'2 SURN')

#recupere dans liste le fichier texte
f=open(lire,'r')
liste= f.readlines()
n=len(liste)
f.close()
#analyse
for j in range(n):
#recherche change
if change.search(liste[j]):
#test 1
print liste[j];
#passe en majuscule la ligne complete
liste[j]=liste[j].upper();
#test 2
print liste[j];

#sauve
ecrire='/home/michel/0_genealogie_en_cours/programme-genealogie/nom_en_majuscule/new.ged'

f=open(ecrire,'w')
f.writelines(liste)
f.close()
==================

Les patronymes passent en majuscule à l'exception du caractère "é" qui
reste "é" dans le nouveau fichier. (é est le seul caractère présent dans
les lignes concernées par la modification).

je suis sous linux fédora 11.

comment faire ?

Cordialement,

Michel

8 réponses

Avatar
Alain Ketterlin
michel writes:

[...]
Les patronymes passent en majuscule à l'exception du caractère "é" qui
reste "é" dans le nouveau fichier. (é est le seul caractèr e présent
dans les lignes concernées par la modification).



Peux-tu essayer de placer les lignes suivantes en tête de ton programm e,
et nous dire ce que cela donne :

import locale
locale.setlocale(locale.LC_ALL,'')

-- Alain.
Avatar
michel
Le 08/09/2010 19:39, Alain Ketterlin a écrit :


Peux-tu essayer de placer les lignes suivantes en tête de ton programme,
et nous dire ce que cela donne :

import locale
locale.setlocale(locale.LC_ALL,'')

-- Alain.



pas de changement é reste é

Michel
Avatar
Francois Lafont
Bonjour,

Cela se produit effectivement en ligne de commandes interactives.

#-------------------------
a = "Éléphant"
print a.upper()






ÉLéPHANT
a = u"Éléphant"
print a.upper()






ÉLÉPHANT
#-------------------------

Il faut, je pense, convertir la chaîne en unicode (ça évite bien des
histoires avec les accents), ensuite lui appliquer la méthode .upper()
(là où c'est nécessaire) et enfin encoder la chaîne dans l'encodage que
vous souhaitez avoir dans votre fichier de sortie.

Par exemple si le fichier en entrée est encodé en utf8 et si vous voulez
écrire le fichier de sortie en latin1, il faudrait, je crois, faire un
truc dans ce genre :

#---------------------------
liste= f_in.readlines()
map(lambda element: element.decode('utf8'), liste)

# ...
# Modification avec .upper() de ce qu'il faut dans liste
# ...

map(lambda element: element.encode('latin1'), liste)

f_out.writelines(liste)
#---------------------------

(Pas testé)


--
François Lafont
Avatar
yves
Le Wed, 08 Sep 2010 19:20:51 +0200, michel a écrit:

Bonjour,


Dans un gros fichier texte je souhaite mettre en majuscule des noms
situés après une balise ( il s'agit d'un fichier "gedcom" utilisé en
généalogie).



Le script suivant, est-ce qu'il marche ?
========================== # -*- coding: utf-8 -*-

FICHIER = "essai.ged"
for ligne in open(FICHIER,"r"):
if ligne.startswith("2 SURN"):
print ligne.upper().replace("é","É")
==========================
pour avoir un E majuscule avec accent aigu dans la console python (à
copier-coller ensuite), faire éventuellement:

print unichr(201)

@+
--
Yves
Avatar
yves
Le Wed, 08 Sep 2010 18:24:41 +0000, yves a écrit:

Un peu moins bourrin (merci camarades):


==========================
# -*- coding: utf-8 -*-

FICHIER = "essai.ged"

for ligne in open(FICHIER,"r"):
if ligne.startswith("2 SURN"):
print ligne.decode("utf8").upper()

==========================
--
Yves
Avatar
michel
Le 08/09/2010 20:00, Francois Lafont a écrit :
Bonjour,

Cela se produit effectivement en ligne de commandes interactives.

#-------------------------
a = "Éléphant"
print a.upper()






ÉLéPHANT
a = u"Éléphant"
print a.upper()






ÉLÉPHANT
#-------------------------




effctivement , fonctionne en ligne de commande

Il faut, je pense, convertir la chaîne en unicode (ça évite bien des
histoires avec les accents), ensuite lui appliquer la méthode .upper()
(là où c'est nécessaire) et enfin encoder la chaîne dans l'encodage que
vous souhaitez avoir dans votre fichier de sortie.

Par exemple si le fichier en entrée est encodé en utf8 et si vous voulez
écrire le fichier de sortie en latin1, il faudrait, je crois, faire un
truc dans ce genre :

#---------------------------
liste= f_in.readlines()
map(lambda element: element.decode('utf8'), liste)

# ...
# Modification avec .upper() de ce qu'il faut dans liste
# ...

map(lambda element: element.encode('latin1'), liste)

f_out.writelines(liste)
#---------------------------

(Pas testé)




là je suis dépassé l'utilisation de la fonction map n'est pas évidente
pour moi .
Avatar
yves
Le Wed, 08 Sep 2010 18:39:55 +0000, yves a écrit:


==========================
#!/usr/bin/python
# -*- coding: utf-8 -*-

#à partir du gedcom gramps "Unchangeed_1.ged"
#je passe les patronymes en majuscule

#sauver le nouveau fichier en new.ged

#fichier à lire
lire='/home/michel/0_genealogie_en_cours/programme-genealogie/
nom_en_majuscule/Untitled_1.ged'

# '2 SURN 'est la balise en debut de ligne

liste_a_ecrire = []

for ligne in open(lire,'r'):
if ligne.startswith("2 SURN"):
ligne = ligne.decode("utf8").upper().encode('utf8')
liste_a_ecrire.append(ligne)

#sauve
ecrire='/home/michel/0_genealogie_en_cours/programme-genealogie/
nom_en_majuscule/new.ged'

f=open(ecrire,'w')
f.writelines(liste_a_ecrire)
f.close()

==========================
--
Yves
Avatar
Francois Lafont
Le 08/09/2010 21:02, michel a écrit :

là je suis dépassé l'utilisation de la fonction map n'est pas évidente
pour moi .



C'est assez simple et d'ailleurs je vais en profiter pour rectifier une
bêtise que j'ai dite dans mon message précédent.

#------------------------------------------------
def f(chaine):






... return chaine + " a subi le traitement."
...
liste = ['aaa', 'bbb', 'ccc']
nouvelle_liste = map(f, liste)
print nouvelle_liste






['aaa a subi le traitement.', 'bbb a subi le traitement.', 'ccc a subi
le traitement.']
#------------------------------------------------

Comme tu peux voir ici, chaque élément de la liste "liste" a subi le
traitement consistant en l'appel de la fonction f et map te renvoie une
nouvelle liste. Et c'est là où j'ai dit une bêtise dans mon message
précédent. Faire "map(f, liste)" tout court ne sert à rien. En effet, je
pensais que ça modifiait la liste "liste", mais en fait ça la laisse
intacte et ça t'en renvoie une nouvelle qu'il faut lier à un nom de
variable (comme dans "var = map(f, liste)" par exemple).

Mais en fait, laisse tomber map() car en fait ceci est bien mieux :

#------------------------------------------------
def f(chaine):






... return chaine + " a subi le traitement."
...
liste = ['aaa', 'bbb', 'ccc']
nouvelle_liste = [f(element) for element in liste]
print nouvelle_liste






['aaa a subi le traitement.', 'bbb a subi le traitement.', 'ccc a subi
le traitement.']
#------------------------------------------------

Là, c'est plus clair.

En général, quand on récupère du texte via un fichier dans une variable
chaine, il faut la convertir en type unicode grâce à :

chaine_unicode = chaine.decode('uft8')
# où utf8 est l'encodage du fichier

Ensuite tu manipules chaine_unicode et tu fais ton traitement sur
chaine_unicode. Et là, plus de problème avec ces histoires d'accents
(c'est tout l'intérêt du type unicode, c'est le type "magique" de
chaines de caractères où tout est merveilleux, le .upper() fera par
exemple ce que tu veux qu'il fasse). Une fois ce traitement effectué sur
chaine_unicode, lors de l'écriture dans un fichier, tu dois convertir
chaine_unicode en le type string classique en spécifiant l'encodage que
tu souhaites avoir pour ton fichier. Par exemple si tu veux encoder ton
fichier en latin1, tu feras :

chaine = chaine_unicode.encode('latin1')
file_out.write(chaine)

Dans l'histoire, il faudra que tu connaisses l'encodage du fichier que
tu lis et il fauda décider de l'encodage du fichier que tu veux écrire
suite au traitement.


--
François Lafont