OVH Cloud OVH Cloud

Découpe d'un texte

12 réponses
Avatar
stealth
Bonjour =E0 tous,

Je cherche la meilleur m=E9thode pour supprimer des lignes dans un texte

Voici mon code (python/GTK) pour l'affichage dans une fenetre GTK

info =3D pexpect.spawn('gpg --decrypt gpg-password.asc', timeout=3D3)
info.expect_exact(['password:', 'Password:', 'passe:'])
info.sendline('%s' % (passe))
text =3D info.read()
text =3D unicode(text, 'ISO-8859-1', 'ignore').encode('UTF-8')
buffer =3D self.textview1.get_buffer()
buffer.set_text(text)

=E7a fonctionne, mais malheuresement gpg ajoute la ligne suivante en
d=E9but de texte (normal).

gpg: chiffr=E9 avec une cl=E9 de 2048 bits ELG-E, ID 6D26EDF9, cr=E9=E9e le
2006-02-13
=AB test <toto@toto.com> =BB
-----BEGIN PGP MESSAGE-----

Comment la supprimer proprement=20

Merci d'avance

10 réponses

1 2
Avatar
Eric Deveaud
wrote:
Bonjour à tous,

Je cherche la meilleur méthode pour supprimer des lignes dans un texte

Voici mon code (python/GTK) pour l'affichage dans une fenetre GTK

info = pexpect.spawn('gpg --decrypt gpg-password.asc', timeout=3)
info.expect_exact(['password:', 'Password:', 'passe:'])
info.sendline('%s' % (passe))
text = info.read()
text = unicode(text, 'ISO-8859-1', 'ignore').encode('UTF-8')
buffer = self.textview1.get_buffer()
buffer.set_text(text)

ça fonctionne, mais malheuresement gpg ajoute la ligne suivante en
début de texte (normal).

gpg: chiffré avec une clé de 2048 bits ELG-E, ID 6D26EDF9, créée le
2006-02-13
« test »
-----BEGIN PGP MESSAGE-----

Comment la supprimer proprement


introduire une fonction de nettoyage de texte apres l'acquisition de text

du genre en admettant que l'on veuille supprimer TOUT ce qui precede
'-----BEGIN PGP MESSAGE-----'

fonction de filtrage:
IN texte = chaine de caractere a filtrer
marqueur
OUT chaine de caracterre filtrée

algo:
pos = trouver la position de marqueur dans text
si pos != -1 (ie le marquer a ete trouve)
text <- text de pos + longueur su marqueur a la fin
sinon
text <- text sans modifications

renvoyer text

idee brute de fonderie apres une journee bien claquante ;-)
je te laisse l'implementation

Eric


--
Je sais pas. Mais un très vieux proverbe macintoshien dit :
Quand BowelsOfTheMemoryMgr dans Macsbug apparoit, redémarer tu dois.
-+- AG in Guide du Macounet Pervers : ...à la mode, à la modeuu... -+-

Avatar
Eric Deveaud
Bruno Desthuilliers wrote:

tttt j'avais dit qu'on laissait l'implementation a l'OP ;-))
alors je vais faire mon chiant ;-)))

S'il n'y a qu'une occurrrence au début:

target = "-----BEGIN PGP MESSAGE-----"
try:
text = text[text.index(target) + len(target)].strip()
~~~~~

^
|
+-- manque : non ??
except ValueError:
pass


pourquoi strip et pas lstrip ?
avec strip tu vas perdre les derniers espaces et n si il y en a ;-)

Eric

--
Tu me commences à me les briser menu. Tu emmerdes le monde en postant à
tort et à travers, pauvre con. Cela est contraire à tous les usages
Usenet et de savoir vivre en général.
-+- EJ in Guide du modérateur pervers - et la politesse bordel ? -+-

Avatar
Bruno Desthuilliers
wrote:

Bonjour à tous,

Je cherche la meilleur méthode pour supprimer des lignes dans un texte

(snip)



ça fonctionne, mais malheuresement gpg ajoute la ligne suivante en
début de texte (normal).

gpg: chiffré avec une clé de 2048 bits ELG-E, ID 6D26EDF9, créée le
2006-02-13
« test »
-----BEGIN PGP MESSAGE-----

Comment la supprimer proprement




S'il n'y a qu'une occurrrence au début:

target = "-----BEGIN PGP MESSAGE-----"
try:
text = text[text.index(target) + len(target)].strip()
except ValueError:
pass


Avatar
stealth
Bonjour et merci de vos réponses

Pour ma culture, comment faire si je souhaite supprimer des lignes
precises.
La premiere ou la troisieme par ex, dans ce cas je ne peux pas utiliser
strip
Avatar
bruno at modulix
wrote:
Bonjour et merci de vos réponses

Pour ma culture, comment faire si je souhaite supprimer des lignes
precises.
La premiere ou la troisieme par ex, dans ce cas je ne peux pas utiliser
strip


En supposant que ton texte est d'un seul block:
lines = text.split('n')
l.pop(indice_de_la_ligne)
text = "n".join(lines)



--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
stealth
le l c'est lines ? dans ce cas quand je test je supprime bien la ligne
mais j'ajoute un espace dans le texte
Avatar
bruno at modulix
wrote:
le l c'est lines ?


Oui, pardon.

dans ce cas quand je test je supprime bien la ligne
mais j'ajoute un espace dans le texte



text = """lorem ipsum
... dolor



... sit amet"""
lines = text.split("n")
lines
['lorem ipsum', 'dolor', 'sit amet']



lines.pop(2)
'sit amet'



lines
['lorem ipsum', 'dolor']



print "n".join(lines)
lorem ipsum



dolor

Il doit y avaoir autre chose dans ton texte, ou un pb de convention de
fin de ligne...


--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"



Avatar
Eric Deveaud
wrote:
Bonjour et merci de vos réponses

Pour ma culture, comment faire si je souhaite supprimer des lignes
precises.
La premiere ou la troisieme par ex, dans ce cas je ne peux pas utiliser
strip


plusieurs options.

1) si tu acquiers le texte ligne par ligne via une boucle de lecture par
exemple

tu poses un compteur avant de lire.
pour chaque ligne lue, tu regarde si ton compteur est un des numeros de lignes
que tu veux supprimer.
si oui tu ne fais rien de la ligne
sinon tu stocke ta ligne
dans tous les cas tu incremente ton compteur de 1 et tu lis la ligne suivante

ex basique:
fonction skiplines_by_number:
IN: fh (filehandle den lecture)
numeros des lignes a ignorer
OUT: le texte lu sur le fh SANS les lignes dont le numero est dans
la liste des numeros a ignorer
texte_filtre <- chaine vide
compteur <- 1 (en general les humains compte a partir de 1)
pour chaque ligne L lue a partir du fh:
si valeur de compteur appartient a la liste des numeros a ignorer:
ne rien faire
sinon:
texte_filtre <- texte_filtre + L
compteur <- compteur +1
renvoyer texte_filtre

de qui donnerai quelque chose du genre

def skiplines_by_number(FH, *exclude_list_line_num):
texte_filtre = ''
cpt = 1
for line in FH:
if cpt in exclude_list_line_num:
continue
else:
texte_filtre += line
cpt +=1
return texte_filtre

NB la forme
if test:
ne rien faire
else:
faire quelque chose

n'etant pas belle on fera plutot


def skiplines_by_number(FH, *exclude_list_line_num):
texte_filtre = ''
cpt = 1
for line in FH:
if not cpt in exclude_list_line_num:
texte_filtre += line
cpt +=1
return texte_filtre


2) ton texte est acquis et tu veux eliminer cetaines lignes
decouper le texte en une liste de lignes
les lignes a eliminer sont les elemnts de la liste dont l'index correspond au
numero

Fonction removelines_by_number
IN: chaine de caractere represantant le texte
liste des numeros de lignes a exclure
OUT: le texte filttre

liste_lignes <- spliter le texte selon les saut de lignes
pour chaque valeur de la liste des numeros de ligne a exclure:
enlever dans la liste l'elements dont l'index est dans la liste
texte_filtre <- joindre la liste des lignes restantes selon les saut de
lignes

NB l'idee pour eliminer les lignes a exclure serait d'utiliser pop, mais
attention en faisant ceci on cours au devant d'un probleme
pop eliminant un element de la liste, modifie la longueur de la liste, donc
modifie la valeur des indices des elements dans la liste.
exemple

L = [A,B,C,D,E,F]

si l'on veut eliminer les elements en position 2 et 4 (soit C et E) de la
liste l'idee qui vient en premier lieux a l'esprit serait de faire

L.pop(2)
L.pop(4)

en detaillant les etapes on a ceci

0 1 2 3 4 5 <- indices
+---+---+---+---+---+---+
L --> | A | B | C | D | E | F |
+---+---+---+---+---+---+

L.pop(2) donnera ceci en supprimant l'element en indice 2 (le C)


0 1 2 3 4 <- indices
+---+---+---+---+---+
L --> | A | B | D | E | F |
+---+---+---+---+---+

on a modifier la longueur de la liste, aie aie que donnera l'elimination de la
valeur en indice 4 (on voulait supprimer le E, et on supprime le F) pas ce
qu'on voulait aie aie.
de plus on risque de se retrouver avec une valeur qui devient invalide pour la
taille de la liste et d'avoir une belle IndexError

pour tourner autour de ce pb, il suffit de commencer a enlever les elements
dans l'ordre decroissant des indices


je propose ceci

def removelines_by_number(text, *exclude_line_num):
vals = list(exclude_line_num)
vals.sort()
vals.reverse() # oui il suffirait de trier correctement
liste_lignes = text.split('n')
for index in vals:
liste_lignes.pop(index)
return 'n'.join(liste_lignes)

ex:
montext = """ligne zero
... ligne un



... ligne deux
... ligne trois
... ligne quatre
... ligne cinq"""
print removelines_by_number(montext, 1, 3, 5)
ligne zero



ligne deux
ligne quatre

Eric

PS il y a encore plein d'autres facon defaire.....

--
un tentative de penetration (pas de sous entendus) d'un systeme peut
etr compare a un viol. Le portscan reviendrait a promener ses doigts
pour voir s'il y a une ceinture de chastete ...
-+- M in GNU - Petit traité de sexualité informatique appliquée -+-



Avatar
bruno at modulix
Eric Deveaud wrote:
wrote:

Bonjour et merci de vos réponses

Pour ma culture, comment faire si je souhaite supprimer des lignes
precises.
La premiere ou la troisieme par ex, dans ce cas je ne peux pas utiliser
strip



plusieurs options.

1) si tu acquiers le texte ligne par ligne via une boucle de lecture par
exemple


(snip)

ex basique:
fonction skiplines_by_number:
IN: fh (filehandle den lecture)
numeros des lignes a ignorer
OUT: le texte lu sur le fh SANS les lignes dont le numero est dans
la liste des numeros a ignorer
texte_filtre <- chaine vide
compteur <- 1 (en general les humains compte a partir de 1)


En général, les informaticiens comptent à partir de 0.

pour chaque ligne L lue a partir du fh:
si valeur de compteur appartient a la liste des numeros a ignorer:
ne rien faire
sinon:
texte_filtre <- texte_filtre + L
compteur <- compteur +1
renvoyer texte_filtre

de qui donnerai quelque chose du genre

def skiplines_by_number(FH, *exclude_list_line_num):


La convention en Python est d'utiliser les UPPER_CASE pour les (pseudo)
constantes symbolique.

texte_filtre = ''
cpt = 1
for line in FH:
if cpt in exclude_list_line_num:
continue
else:
texte_filtre += line
cpt +=1
return texte_filtre



Où comment s'emm... la vie pour rien !-)

(Non, Eric, pas taper... Aïe, Non !)

Pour ce qui est du compteur, enumerate(seq) fait ça tout seul...
Pour ce qui est de filtrer, il y a filter()

bref:

def skip_from_iter(lines, *exclude_indices):
return filter(lambda i, line: i not in exclude_indices,
enumerate(lines))

Note que fichier, liste, ou n'importe autre quel iterable fait aussi
bien l'affaire.


(snip)
2) ton texte est acquis et tu veux eliminer cetaines lignes


Bref, même chose que ci-dessus avec un split/join autour:

def remove_from_text(text, sep="n", *exclude_indices):
return sep.join(skip_from_iter(text.split(sep),
*exclude_indices))

Note que l'intérêt de réutiliser la même fonction est que si on optimise
cette fonction, tout le monde en profite...

(snip)

PS il y a encore plein d'autres facon defaire.....


N'est-ce pas ?-)


--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"


Avatar
Méta-MCI
[HS]

En général, les informaticiens comptent à partir de 0.




En fait, ce sont les ricains qui comptent en démarrant à 0 ; et pas
seulement pour l'informatique.

Mais, ils ont quasi imposé plusieurs de leurs manies, comme la taille des
matériels en pouces, le point d'origine des écrans texte en bas à gauche,
etc.

@+

MCI



1 2