Accents - Bogue étrange en Python

Accents - Bogue étrange en Python - Python - Programmation

Marsh Posté le 03-02-2009 à 19:20:58    

Mon programme est simple, le voici:
 
**********************************************
def write_file(nomDuFichier,contenu):
        fichier = open(nomDuFichier,"w" )
        fichier.write(contenu)
        fichier.close()
 
def load_mots(nomDuFichier):
        fichier = open(nomDuFichier,"r" )
        lignes=fichier.readlines()
        fichier.close()
        return lignes
 
def spliter(mots,output):
     for i in range(0,len(mots),1):
         mot=mots[i].split("\n" )[0]
         write_file(output+"/"+mot+".txt",mot)
 
mots = load_mots("mots.txt" )
spliter(mots,"mots" )     # "mots" c'est le nom du dossier où les fichiers sont créer
***********************************************
 
Donc en gros, ça ouvre un fichier mots.txt contenant un mot (ou expression) par ligne
et ça crée un fichier par mot (nommée  "le mot en question".txt et qui contient "le mot en question" )
 
Par exemple si j'ai dans mots.txt:
 
***********
laitue
fromage
des biscuits
patate
***********
 
Je vais obtenir 4 fichiers, soient:
 
laitue.txt (contenant laitue)
fromage.txt (contenant fromage)
des biscuits.txt (contenant des biscuits)
patate.txt (contenant patate)
 
Le programme fonctionne parfaitement SAUF dans certains cas très douteux comme si j'ai dans mots.txt:
 
************
laitue
à gauche
du poulet
à droite
étrange
************
 
j'obtient:
 
laitue.txt (contenant laitue)
à gauche.txt (contenant □□□□)                    <------------------------------POURQUOI???  
du poulet.txt (contenant des du poulet)
à droite.txt (contenant à droite)
étrange.text (contenant étrange)
 
 
Je ne comprends pas, ce n'est pas un problème d'accent, les autres fonctionnent
Je ne comprend vraiment pas, même "à droite" fonctionnent
même le nom du fichier est correct
 
J'ai fait d'autre test et voici d'autre qui me donne des résultats semblables:
 
aaéaaa.txt  contient     □□□
aaéaaaa.txt  contient   aaéaaaa
aaéaaaaa.txt  contient    □□□□
aaéaaaaaa.txt  contient    aaéaaaaaa
aaéaaaaaaa.txt  contient    □□□□□
aaéaaaaaaaa.txt  contient    aaéaaaaaaaa
aaéaaaaaaaaatxt  contient    □□□□□□
 
(il me semble y avoir une régularité avec ceux qui sont pairs... mais c'est étrange)
 
Avez-vous une idée d'où provient ce bug
 
Merci

Reply

Marsh Posté le 03-02-2009 à 19:20:58   

Reply

Marsh Posté le 04-02-2009 à 12:12:48    

Au pif je dirais que tu ouvre tes fichiers .txt avec notepad.
Celui-ci essaye de deviner l'encodage des fichiers textes pour afficher les caractères correctement quelque soit l'encodage.
Pour deviner il fait des statistiques, or les statistiques sur des chaines aussi petites ça dévie facilement, du coup il se plante et parfois affiche pas avec le bon encodage.

 

C'est pas sûr, mais je doute que python ait un bug sur les accents "que de temps en temps" et sans que ce soit un cas spécial genre "accent sur le 1er caractère du fichier", essaye d'ouvrir tes fichiers textes avec un autre éditeur un peu plus évolué, et si c'est bien ça, regarde dans la doc de python comment on choisit l'encodage des chaines qu'on écrit dans un fichier.

Message cité 1 fois
Message édité par 0x90 le 04-02-2009 à 12:13:16

---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 04-02-2009 à 13:21:23    

Wow merci!
 
C'est exactement ça. Si je l'ouvre avec autre chose que NotePad, ça fonctionne, il n'y a plus les □□□. J'aurais vraiment du essayer de les ouvrir avec autre chose, mais je me suis trop concentré sur le l'étrangeté des conditions d'apparition du bogue.
 
Merci encore

Reply

Marsh Posté le 04-02-2009 à 14:28:25    

0x90 a écrit :

regarde dans la doc de python comment on choisit l'encodage des chaines qu'on écrit dans un fichier.


En 2.x avec codecs.open(file, mode, encoding) qui prend et sort de l'unicode, sinon en appelant manuellement "decode" sur un string et "encode" sur un unicode (codecs.open est un wrapper sur open qui fait simplement l'encoding et le decoding automatiquement)


Message édité par masklinn le 04-02-2009 à 14:28:52

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed