Je dois faire un script qui supprime les commentaires et les lignes vides.
Ce sont les lignes qui commencent par un '#'.
Python ne lève pas d'exception quand on fait un readline(), il retourne
juste ''. Le souci c'est que c'est le même pattern que la ligne vide, je ne
peut donc m'en servir pour terminer la recursion. J'y vais en mode
fonctionnel/recursif, c'est juste une histoire de gout.
Comment s'y prend-on?
Merci.
--
Un CMS Français à découvrir: CPS. (http://www.cps-project.org)
Hébergement gratuit de sites Zope, Plone, et CPS: http://www.objectis.org
Un lien qui peut servir:
http://www.google.fr/search?q=aspo+infogerance+serveur
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
R12y
Comment s'y prend-on?
Bon... c'est toujours (juste) après avoir demandé qu'on trouve...: http://www.oreilly.com/catalog/lpython/chapter/ch09.html#16308 Il est dit: [...] The readlines function is useful when implementing simple filter operations. Here are a few examples of such filter operations: Finding all lines that start with a #
import sys for line in sys.stdin.readlines(): if line[0] == '#': print line,
Note that a final comma is needed after the print statement because the line string already includes a newline character as its last character. [...]
Je peux m'en servir pour imprimer (print) les ligne ne commençant _pas_ par '#'.
Désolé hein! :-)
-- Un CMS Français à découvrir: CPS. (http://www.cps-project.org) Hébergement gratuit de sites Zope, Plone, et CPS: http://www.objectis.org Un lien qui peut servir: http://www.google.fr/search?q=aspo+infogerance+serveur
Comment s'y prend-on?
Bon... c'est toujours (juste) après avoir demandé qu'on trouve...:
http://www.oreilly.com/catalog/lpython/chapter/ch09.html#16308
Il est dit:
[...]
The readlines function is useful when implementing simple filter operations.
Here are a few examples of such filter operations:
Finding all lines that start with a #
import sys
for line in sys.stdin.readlines():
if line[0] == '#':
print line,
Note that a final comma is needed after the print statement because the
line string already includes a newline character as its last character.
[...]
Je peux m'en servir pour imprimer (print) les ligne ne commençant _pas_ par
'#'.
Désolé hein! :-)
--
Un CMS Français à découvrir: CPS. (http://www.cps-project.org)
Hébergement gratuit de sites Zope, Plone, et CPS: http://www.objectis.org
Un lien qui peut servir:
http://www.google.fr/search?q=aspo+infogerance+serveur
Bon... c'est toujours (juste) après avoir demandé qu'on trouve...: http://www.oreilly.com/catalog/lpython/chapter/ch09.html#16308 Il est dit: [...] The readlines function is useful when implementing simple filter operations. Here are a few examples of such filter operations: Finding all lines that start with a #
import sys for line in sys.stdin.readlines(): if line[0] == '#': print line,
Note that a final comma is needed after the print statement because the line string already includes a newline character as its last character. [...]
Je peux m'en servir pour imprimer (print) les ligne ne commençant _pas_ par '#'.
Désolé hein! :-)
-- Un CMS Français à découvrir: CPS. (http://www.cps-project.org) Hébergement gratuit de sites Zope, Plone, et CPS: http://www.objectis.org Un lien qui peut servir: http://www.google.fr/search?q=aspo+infogerance+serveur
Do Re Mi chel La Si Do
Bonsoir !
Mais que se passera-t'il, si la ligne commence par 4 espaces, suivis d'un # ?
@-salutations
Michel Claveau
Bonsoir !
Mais que se passera-t'il, si la ligne commence par 4 espaces, suivis d'un #
?
Mais que se passera-t'il, si la ligne commence par 4 espaces, suivis d'un # ?
@-salutations
Michel Claveau
elle ne sera pas détectée, mais il suffit d'utiliser un strip dans le test pour virer les espaces du début et vérifier le premier caractère:
line.strip () [0] == '#'
mes 2 cents
-- rafi
"Imagination is more important than knowledge." (Albert Einstein)
F. Petitjean
Do Re Mi chel La Si Do wrote:
Mais que se passera-t'il, si la ligne commence par 4 espaces, suivis d'un # ?
elle ne sera pas détectée, mais il suffit d'utiliser un strip dans le test pour virer les espaces du début et vérifier le premier caractère:
line.strip () [0] == '#'
mes 2 cents
Effectivement cette solution ne vaut pas cher :
line = ' n' line.strip()[0] Traceback (most recent call last): File "<stdin>", line 1, in ? IndexError: string index out of range
Je suis étonné que personne n'ait proposé de solution à base d'itérateur/générateur. (non testé) fin = open(fname) for line in lirenoncomm(fin): print line fin.close()
def lirenoncomm(fin, ccomm='#'): """ne génère que les lignes non vides et non en commentaires""" for line in fin: line = line.rstrip() # supprimé le 'n' de fin (et autres espaces) if not line: continue # ligne vide if line.lstrip().startswith(ccomm): continue yield line
On pourrait combiner avec un autre filtre (basé sur un itérateur) qui remplace : if not line: continue # ligne vide par if not line: continue ceci est laissé comme exercice pour le lecteur.
Do Re Mi chel La Si Do wrote:
Mais que se passera-t'il, si la ligne commence par 4 espaces, suivis d'un #
?
elle ne sera pas détectée, mais il suffit d'utiliser un strip dans le
test pour virer les espaces du début et vérifier le premier caractère:
line.strip () [0] == '#'
mes 2 cents
Effectivement cette solution ne vaut pas cher :
line = ' n'
line.strip()[0]
Traceback (most recent call last):
File "<stdin>", line 1, in ?
IndexError: string index out of range
Je suis étonné que personne n'ait proposé de solution à base
d'itérateur/générateur. (non testé)
fin = open(fname)
for line in lirenoncomm(fin):
print line
fin.close()
def lirenoncomm(fin, ccomm='#'):
"""ne génère que les lignes non vides et non en commentaires"""
for line in fin:
line = line.rstrip() # supprimé le 'n' de fin (et autres espaces)
if not line: continue # ligne vide
if line.lstrip().startswith(ccomm): continue
yield line
On pourrait combiner avec un autre filtre (basé sur un itérateur) qui
remplace :
if not line: continue # ligne vide
par
if not line: continue
ceci est laissé comme exercice pour le lecteur.
Mais que se passera-t'il, si la ligne commence par 4 espaces, suivis d'un # ?
elle ne sera pas détectée, mais il suffit d'utiliser un strip dans le test pour virer les espaces du début et vérifier le premier caractère:
line.strip () [0] == '#'
mes 2 cents
Effectivement cette solution ne vaut pas cher :
line = ' n' line.strip()[0] Traceback (most recent call last): File "<stdin>", line 1, in ? IndexError: string index out of range
Je suis étonné que personne n'ait proposé de solution à base d'itérateur/générateur. (non testé) fin = open(fname) for line in lirenoncomm(fin): print line fin.close()
def lirenoncomm(fin, ccomm='#'): """ne génère que les lignes non vides et non en commentaires""" for line in fin: line = line.rstrip() # supprimé le 'n' de fin (et autres espaces) if not line: continue # ligne vide if line.lstrip().startswith(ccomm): continue yield line
On pourrait combiner avec un autre filtre (basé sur un itérateur) qui remplace : if not line: continue # ligne vide par if not line: continue ceci est laissé comme exercice pour le lecteur.
rafi
F. Petitjean wrote:
Do Re Mi chel La Si Do wrote:
Mais que se passera-t'il, si la ligne commence par 4 espaces, suivis d'un # ?
elle ne sera pas détectée, mais il suffit d'utiliser un strip dans le test pour virer les espaces du début et vérifier le premier caractère:
line.strip () [0] == '#'
mes 2 cents
Effectivement cette solution ne vaut pas cher : line = ' n' line.strip()[0] Traceback (most recent call last): File "<stdin>", line 1, in ? IndexError: string index out of range
effectivement j'ai conservé le [0] de la proposition précédente ce qui n'était pas judicieux... startswith résouds ce défaut.
line.strip () .startswith ('#')
On pourrait combiner avec un autre filtre (basé sur un itérateur) qui remplace : if not line: continue # ligne vide par if not line: continue
?
-- rafi
"Imagination is more important than knowledge." (Albert Einstein)
F. Petitjean wrote:
Do Re Mi chel La Si Do wrote:
Mais que se passera-t'il, si la ligne commence par 4 espaces, suivis d'un #
?
elle ne sera pas détectée, mais il suffit d'utiliser un strip dans le
test pour virer les espaces du début et vérifier le premier caractère:
line.strip () [0] == '#'
mes 2 cents
Effectivement cette solution ne vaut pas cher :
line = ' n'
line.strip()[0]
Traceback (most recent call last):
File "<stdin>", line 1, in ?
IndexError: string index out of range
effectivement j'ai conservé le [0] de la proposition précédente ce qui
n'était pas judicieux... startswith résouds ce défaut.
line.strip () .startswith ('#')
On pourrait combiner avec un autre filtre (basé sur un itérateur) qui
remplace :
if not line: continue # ligne vide
par
if not line: continue
?
--
rafi
"Imagination is more important than knowledge."
(Albert Einstein)
Mais que se passera-t'il, si la ligne commence par 4 espaces, suivis d'un # ?
elle ne sera pas détectée, mais il suffit d'utiliser un strip dans le test pour virer les espaces du début et vérifier le premier caractère:
line.strip () [0] == '#'
mes 2 cents
Effectivement cette solution ne vaut pas cher : line = ' n' line.strip()[0] Traceback (most recent call last): File "<stdin>", line 1, in ? IndexError: string index out of range
effectivement j'ai conservé le [0] de la proposition précédente ce qui n'était pas judicieux... startswith résouds ce défaut.
line.strip () .startswith ('#')
On pourrait combiner avec un autre filtre (basé sur un itérateur) qui remplace : if not line: continue # ligne vide par if not line: continue
?
-- rafi
"Imagination is more important than knowledge." (Albert Einstein)
F. Petitjean
F. Petitjean wrote:
On pourrait combiner avec un autre filtre (basé sur un itérateur) qui remplace : if not line: continue # ligne vide par if not line: continue
?
Ce que je veux dire, c'est qu'on peut avoir des lignes non vides mais
dont le contenu utile est suivi d'une partie commentaire (pouvant commencer par le caractère '#'). Ceci est un problème différent mais qui peut être résolu en python d'une manière similaire avec un générateur. L'avanatge d'une solution à base de générateur est évidemment la possibilité de combiner les itérateurs associés.
Un autre problème analogue est le regroupement de lignes suites comme dans : txt = "il va y avoir " " du sport" ou bien en FORTRAN 90 : if ( ( x1 < 0.0 .or. x2 > 2.0 ) .and. & ( y1 > 100.0 .and. y2 > 100.0 )) then ! condition bien tordue
Là encore, cela fait partie des exercices de l'été pour le lecteur :-)
Amicalement.
F. Petitjean wrote:
On pourrait combiner avec un autre filtre (basé sur un itérateur) qui
remplace :
if not line: continue # ligne vide
par
if not line: continue
?
Ce que je veux dire, c'est qu'on peut avoir des lignes non vides mais
dont le contenu utile est suivi d'une partie commentaire (pouvant
commencer par le caractère '#'). Ceci est un problème différent mais qui
peut être résolu en python d'une manière similaire avec un générateur.
L'avanatge d'une solution à base de générateur est évidemment la
possibilité de combiner les itérateurs associés.
Un autre problème analogue est le regroupement de lignes suites comme
dans :
txt = "il va y avoir "
" du sport"
ou bien en FORTRAN 90 :
if ( ( x1 < 0.0 .or. x2 > 2.0 ) .and. &
( y1 > 100.0 .and. y2 > 100.0 )) then ! condition bien tordue
Là encore, cela fait partie des exercices de l'été pour le lecteur :-)
On pourrait combiner avec un autre filtre (basé sur un itérateur) qui remplace : if not line: continue # ligne vide par if not line: continue
?
Ce que je veux dire, c'est qu'on peut avoir des lignes non vides mais
dont le contenu utile est suivi d'une partie commentaire (pouvant commencer par le caractère '#'). Ceci est un problème différent mais qui peut être résolu en python d'une manière similaire avec un générateur. L'avanatge d'une solution à base de générateur est évidemment la possibilité de combiner les itérateurs associés.
Un autre problème analogue est le regroupement de lignes suites comme dans : txt = "il va y avoir " " du sport" ou bien en FORTRAN 90 : if ( ( x1 < 0.0 .or. x2 > 2.0 ) .and. & ( y1 > 100.0 .and. y2 > 100.0 )) then ! condition bien tordue
Là encore, cela fait partie des exercices de l'été pour le lecteur :-)