OVH Cloud OVH Cloud

detecter un EOF

6 réponses
Avatar
R12y
Bonjour,

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

6 réponses

Avatar
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

Avatar
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
Avatar
rafi
Do Re Mi chel La Si Do wrote:
Bonsoir !

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)

Avatar
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.


Avatar
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)



Avatar
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.