masklinn í dag viðrar vel til loftárása | newtonishappy a écrit :
Bonjour à toutes et à tous ! j'ai une incompréhension dans mon code python. Je dois m'occuper de trouver un mot dans un .txt et de l'afficher en couleur, tout fonctionne correctement seulement quand je fait le .find il analyse seulement le premier mot de la phrase et le reste il zappe, pourtant je mets bien le readlines dans une variable que j'analyse par la suite. voici le code : Code :
ERROR='\033[91m' END='\033[0m' WARNING="\033[93m" # Open a file fo = open("foo.txt", "r" ) print "Name of the file: ", fo.name fo = open("foo.txt",'r') lines=fo.readlines() print lines for line in lines: print "studying line.." if line.find('Bruno'): print "not find" else: print str(ERROR) print "ERROR" print line print str(END) if line.find('This is 3rd line\n'): print "not find" else: print str(WARNING) print "WARNING" print line print str(END) fo.close()
| Par exemple vous voyez ligne 30 je suis obligé de mettre la totalité de la phrase sinon il ne la trouve pas, il ne trouvera pas si je mets : "3rd" par exemple.
|
Bah c'est normal ton test est tout foireux
S.find(sub [,start [,end]]) -> int Return the lowest index in S where substring sub is found, such that sub is contained within s[start:end]. Optional arguments start and end are interpreted as in slice notation. Return -1 on failure.
|
Le résultat de `find` n'est pas un booléen, c'est l'index de l'élément trouvé ou -1 s'il n'a pas été trouvé, donc 0 (qui est falsy) c'est que l'élément est trouvé à l'index 0, 8 c'est qu'il est trouvé à l'index 8 et -1 c'est qu'il est pas trouvé. Accessoirement,
- Tu devrais factoriser ta sortie colorée
- Tu ouvres 2 fois le même fichier sans le fermer
- Tu devrais utiliser with, et tu peux fermer le fichier juste après le readline puisque readline lit tout en mémoire (ou alors tu itères proprement sur le fichier)
- Si tu veux juste savoir si un mot est dans un ligne sans avoir son index, il suffit d'utiliser l'opérateur in. `find` c'est pour savoir exactement où la sous-chaîne est, si présente (et `index` permet de savoir où la sous chaîne est avec une assertion de présence: si la sous-chaîne est absence ça envoie une exception)
Code :
ERROR='\033[91m' END='\033[0m' WARNING="\033[93m" def error(s): print "%sERROR: %s%s" % (ERROR, s, END) def warn(s): print "%sWARNING: %s%s" % (WARNING, s, END) with open('foo.txt', 'rb') as fo: print "Name of the file: ", fo.name for line in fo: print "studying line...", if "Bruno" in line: error(line) elif '3rd' in line: warn(line) else: print "no match"
|
Message édité par masklinn le 26-07-2013 à 16:37:47 ---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
|