Je me mets à Python

Grace à ce forum (ou à cause de lui ? :wink:) et plus précisément au fil « Débuter en programmation », j’ai eu envie de me mettre à Python.

Je précise que je ne suis pas du tout étudiant en informatique, c’est donc par pure curiosité/attrait que je me lance. Je précise aussi que j’ai quelques notions de php (je sais donc ce qu’est une boucle ou une fonction, même si, si je devais les définir, les « pros » rigoleraient certainement en me pointant du doigt :stuck_out_tongue:) : il m’était arrivé de « coder » (terme pompeux) des (petits) mods pour phpBB, ou, pour donner un autre exemple et tenter de fixer mon (petit) « niveau », j’avais pondu un petit script d’upload et de manipulation d’images (redimensionnement, ajout de légende, etc. ; bref je m’étais amusé avec GD). Dernière précision : j’ai toujours eu du mal à me mettre à la programmation orientée objet, y’a un blocage cognitif qui devait opérer, en php, pour ce que je faisais, j’ai toujours trouve ça « lourd » et surtout, j’avais l’impression de mettre les doigts dans un truc que je ne maîtrisais pas.

Bref. Aujourd’hui c’est donc Python qui m’intéresse avec pour double objectif : de m’amuser / de me créer des ptits trucs qui rendent la vie plus facile.

C’est pourquoi, en ce deuxième jour d’apprentissage, j’essaie simplement de créer un script qui automatise la « mise en forme » d’un texte en html. Plus concrètement, je veux :

  • ajouter des espaces insécables quand c’est nécessaire
  • dégager du code qui sert à rien (style « ­ »)
  • et c’est déjà bien :stuck_out_tongue:

Pour le moment, je fais ça sans interface graphique (je verrai plus tard, avec PyQT) ; voici le bout de code que j’ai tapé :

[code]from os import chdir
chdir("/home/julien/Desktop/")
mon_fichier = open(‘freidson.html’,‘r’)
contenu_fichier = mon_fichier.read()

contenu_fichier = contenu_fichier.replace(’ &raquo’, ’ »’)
contenu_fichier = contenu_fichier.replace(’&laquo ‘, ‘« ‘)
contenu_fichier = contenu_fichier.replace(’ !’, ’ !’)
contenu_fichier = contenu_fichier.replace(’ ?’, ’ ?’)
contenu_fichier = contenu_fichier.replace(‘­’, ‘’)

print contenu_fichier[/code]

Avant d’aller plus loin, j’aimerais résoudre le problème suivant : comment faire pour détecter un &laquo (c’est un guillemet français) en fin de ligne ? Et dans la lancée, un » en début de ligne ? (Le texte à « parser » (le terme est-il juste ?) vient d’un logiciel d’OCR que je rebalance dans ooo et il est fréquent que les guillemets débutent ou finissent une ligne). Parce que là, c’est bien joli de fonctionner avec l’espace, mais dans les deux cas pré-cités, ça ne fonctionne pas.

Faut-il passer par les expressions régulières ?
Plus globalement, ce bout de code est-il « bon » où y’a-t-il plus « optimisé » ?

Merci :wink:

(et attendez-vous à me revoir au fil de mon apprentissage :wink: )

La fonction replace peut etre.

Oh ! Ca fait plaisir d’avoir été utile avec un bon fil pour une fois. :laughing:
Moi, je me lance dans le C. :wink:

Sur python, je ne pourrais pas aider beaucoup. :cry:

Euh, je ne suis pas sûr que tu aies bien compris le problème :confused: J’utilise déjà la méthode replace (cf. mon code).

[quote=“wavesound”]Oh ! Ca fait plaisir d’avoir été utile avec un bon fil pour une fois. :laughing:
Moi, je me lance dans le C. :wink:[/quote]

Oui c’est ce que j’ai vu :wink: Et je te souhaite bon courage :wink: Qui sait, peut-être qu’un jour j’y viendrai :stuck_out_tongue:

Bon ben j’attendrai l’intervention de « Pythonniens ».

Merci quand même.

Je suis pas un pythonnien mais peut être puis-je être utile.

Tu veut quelque chose du type

si guillemet à la fin traitement
?

Si c’est le cas les regexp sont tes amies.

  1. Tu importe re
  1. Tu crée un filtre avec la fonction re.compile()
  2. Tu l’applique avec re.search()

Sinon tu peut t’en sortir en parcourant tes strings caractère par caractère.

Oui, utiliser les regex est bien ce que j’avais en tête.

Mais je ne m’en sors pas :

[code]from os import chdir
import re

chdir("/home/julien/Desktop/")
mon_fichier = open(‘freidson.html’,‘r’)
contenu_fichier = mon_fichier.read()

contenu_fichier = contenu_fichier.replace(’ &raquo’, ’ »’)
contenu_fichier = contenu_fichier.replace(’&laquo ‘, ‘« ‘)
contenu_fichier = contenu_fichier.replace(’ !’, ’ !’)
contenu_fichier = contenu_fichier.replace(’ ?’, ’ ?’)
contenu_fichier = contenu_fichier.replace(‘­’, ‘’)

a = re.compile(‘de’)
b = re.search(a, contenu_fichier)

if b:
print "trouvé"
else :
print “non trouvé”
[/code]

renvoie bien « trouvé ». Mais si je tente : re.compile(‘de$’), j’ai « non trouvé » (alors que « de » se situe bien à la fin d’une ligne).

(edit : bien sûr je prends l’article « de » pour l’exemple, mais dans les faits ce sera bien pour utiliser cela avec les guillemets, effectivement)

Désolé je l’avais fait de tête. search est mal employé.
En fait on fait appelle à la regexp pour tester une chaine donc on s’en sert comme ça :

[code]

En fait search renvoie un objet qui contient les occurrences trouvées.

Tu peut t’en servir comme ça :

a = re.compile("[AZERTY]") if a.search(Str) : // traitement

Ok, alors voici ce que se passe :

[code]chaine = “Ceci est un test”

a = re.compile(’^Ceci’)
if a.search(chaine):
print "trouvé"
else :
print “non trouvé”[/code]

affiche bien « trouvé ». Mais si « chaine » est le contenu du fichier (variable contenu_fichier dans le script précédent), ça ne fonctionne pas.

Pour être plus précis, ça fonctionne pour une recherche qui n’inclue aucune syntaxe propre aux expressions régulières (par exemple : re.compile(‘Pour’)) mais ça renvoie « non trouvé » dès qu’il y en a une (comme re.comple(’^Pour’))

Tu es sur que contenu_fichier contiens tout :question:

Oui oui, si je le « print », j’ai bien tout le contenu qui est affiché.

Pour ce que tu veux faire, si c’est bien en fin de ligne, aka, a la fin de la “string”, alors une expression régulière résoudra ton problème.

Sinon, string.endswith(“tachaine”) peut t’aider…
A+

Oh, ed ! :smiley:
Tu te fais rare ! :unamused:

ce qui est rare est cher.
Trés cher ed bonjour sur ton forum :wink:

J’ai renommé le fil “Débuter en programmation” en “Je me mets au C…” sur le modèle de “Je me mets à Python…” afin de créer deux topics distincts, un pour le C, l’autre pour le Python. Cela orientera l’aide convenablement et ne fera pas fouilli. Voila ! :wink:

Bon en fait je pense que je me plante lamentablement dans l’utilisation des expressions régulières ; ce n’est donc pas un problème de python à proprement parlé.

Je cherche à isoler une séquence de caractère à la fin d’une ligne. Je pensais qu’il fallait utiliser « $ » mais visiblement cela agit sur la fin de la chaîne. Donc là y’a un truc que je maîtrise pas, car des recherche sur Google m’indique bien que le $ correspond à une « fin de ligne ».

Par exemple sur ce texte, le signe dollar me permet de trouver « albums » mais pas « originales ».

La ta chaine ça doit être tout le texte.

Toi tu veux aparament spliiter ça par newline.

Donc pour recherche ce que tu veux:

tasuperlonguechaine = "blah\nblah\nblah"

for newline in tasuperlonguechaine.split("\n"):
  expression_regulière_compilée.match('expressionrégulière$')

A+

Aaah nickel, merci beaucoup :smiley:

C’est tout bête mais faut y penser :unamused:

Bon, histoire de progresser (c’est quand même mon but), plusieurs questions maintenant :

1- à quoi ça sert de « compiler » l’expression régulière ? J’avoue ne pas comprendre.
2- quelle est la différence entre search et match ? J’ai bien lu la doc de python à ce sujet (y’a même une page nommée « matching vs searching ») mais ça reste obscure (en tout cas je retiens le : « If you want to locate a match anywhere in string, use search() instead. »)
3- J’ai bien lu le cours de G. Swinnen sur l’importation des modules ; je ne comprends pas pourquoi « from re import * » plante alors que « import re » fonctionne. Deux le deux cas on demande de tout importer, non ?

et une quatrième question plus générale :
4- est-il imaginable d’utiliser Python en CGI en lieu et place de PHP pour des scripts qui, généralement, tournent justement en PHP (livres d’or, forum, CMS, etc.) ? Y a-t-il des avantages à cela ? Des inconvénients ?

Voilà, encore merci :wink:
[size=75]
Edit : ouais en fait il était plus simple de se passer des expressions régulières :
contenu_fichier = contenu_fichier.replace(’«\n’, ‘« \n’)
contenu_fichier = contenu_fichier.replace(’\n»’, ‘\n »’)

D’ailleurs si je « sais » faire une recherche avec les expressions régulières, je ne sais toujours pas effectuer un remplacement .[/size]

Bon ben voilà le code « final » de mon humble premier « programme » :

[code]# -- coding: UTF-8 --

from os import chdir
import re

chdir("/home/julien/Desktop/")
mon_fichier = open(‘test.txt’,‘r’)
contenu_fichier = mon_fichier.read()

#~ Remplacement ou inclusion d’espaces insécables dans le texte
#~ à gauche du signe, ou en début de ligne
recherche = r’(^)?([a-zA-Z1-9])( )(!|?|:|&raquo)‘
remplace = r’\2 \4’

#~ Remplacement ou inclusion d’espaces insécables dans le texte
#~ à droite du signe, ou en fin de ligne
recherche2 = r’(«)( )([a-zA-Z1-9])($)?‘
remplace2 = r’« \3’

output = “”

for chaque_ligne in contenu_fichier.split("\n"):
traitement_ligne= re.sub(recherche, remplace, chaque_ligne)
traitement_ligne = re.sub(recherche2, remplace2, traitement_ligne)
output = output + ‘\n’ + traitement_ligne

print output[/code]

C’est tout bête mais mine de rien ça me sera utile quand même :wink:

Sinon, j’ai les réponses pour 3 des quatre questions posées plus haut. Le point 3/ (sur les modules) reste un peu obscur.

Il me semble que non justement, , from re import * importe tout le module, alors que import re importera uniquement la fonction re.

  • Signifiant tout

Cela dit je sais pas pourquoi ça plante…