OVH Cloud OVH Cloud

prélever zones de texte

11 réponses
Avatar
remi
Bonjour,

Je souhaiterais écrire un script qui prélève certaines zones de texte
dans un fichier.
Par exemple,

\section{Titre 1}

texte à prélever et à stocker dans un fichier (numéro 1)

\section{Titre 2}

texte à prélever et à stocker dans un fichier (numéro 2)

Je sais comment faire pour l'écriture dans le fichier.
Auriez-vous un idée ? Un lien utile ?
N'ai-je pas d'autre solution que d'utiliser le module re ?
Merci.
Rémi.

10 réponses

1 2
Avatar
Bruno Desthuilliers
Bonjour,

Je souhaiterais écrire un script qui prélève certaines zones de texte
dans un fichier.
Par exemple,

section{Titre 1}

texte à prélever et à stocker dans un fichier (numéro 1)

section{Titre 2}

texte à prélever et à stocker dans un fichier (numéro 2)

Je sais comment faire pour l'écriture dans le fichier.
Auriez-vous un idée ? Un lien utile ?
N'ai-je pas d'autre solution que d'utiliser le module re ?


Si - écrire une grammaire formelle et un parser spécialisé par exemple.
Mais je ne suis pas sur que ce soit justifié.

A toutes fins utiles, le livre Text Processing in Python de David Mertz
aborde ce genre de problème :
http://gnosis.cx/TPiP/

Pas mieux...
Bruno

Avatar
yves
On Sat, 12 Mar 2005 11:35:10 +0100, remi wrote:

Bonjour,

Je souhaiterais écrire un script qui prélève certaines zones de texte
dans un fichier.
Par exemple,

section{Titre 1}

texte à prélever et à stocker dans un fichier (numéro 1)

section{Titre 2}

texte à prélever et à stocker dans un fichier (numéro 2)

Je sais comment faire pour l'écriture dans le fichier.
Auriez-vous un idée ? Un lien utile ?
N'ai-je pas d'autre solution que d'utiliser le module re ?


Le bout de code (goret) que j'avais posté ici ne convient pas?
(http://minilien.com/?XEbWMzm91x)

Peux-tu détailler le problème, dans ce cas?

--
Yves

Avatar
remi

Bonjour,

Je souhaiterais écrire un script qui prélève certaines zones de texte
dans un fichier.
Par exemple,

section{Titre 1}

texte à prélever et à stocker dans un fichier (numéro 1)

section{Titre 2}

texte à prélever et à stocker dans un fichier (numéro 2)

[...]


Si - écrire une grammaire formelle et un parser spécialisé par exemple.
Mais je ne suis pas sur que ce soit justifié.

A toutes fins utiles, le livre Text Processing in Python de David Mertz
aborde ce genre de problème :
http://gnosis.cx/TPiP/


Merci pour ce lien utile !

Sinon, je pensai, dans un premier temps, écrire le texte sous la forme :
section{Titre 1}

texte{texte à prélever et à stocker dans un fichier (numéro 1)}

section{Titre 2}

texte{texte à prélever et à stocker dans un fichier (numéro 2)}

et utiliser le module re en faisant qqch du style :

listes_textes = []
for ligne in file_in:
listes_textes.extend(re.findall('\texte{.*}',ligne))

Je pense obtenir ainsi la liste des paragraphes... Je vais tester.
Rémi.








Avatar
F. Petitjean
Bonjour,

Je souhaiterais écrire un script qui prélève certaines zones de texte
dans un fichier.
Par exemple,

section{Titre 1}

texte à prélever et à stocker dans un fichier (numéro 1)

section{Titre 2}

texte à prélever et à stocker dans un fichier (numéro 2)

Je sais comment faire pour l'écriture dans le fichier.
Auriez-vous un idée ? Un lien utile ?
N'ai-je pas d'autre solution que d'utiliser le module re ?
Si les « section{titre section} » peuvent apparaitre n'importe où sur

la ligne je ne vois pas d'autres solutions que d'utiliser le module re.
Par contre si, comme il est vraisemblable, les « section{...} » sont
toujours sur une ligne séparée vous devriez pouvoir vous débrouiller
avec un test du genre (*)
if line.startswith(r'section{'):
# début d'une nouvelle section :
# fermeture du fichire section précédent (éventuellement)
# ouverture d'un nouveau fichier
Merci.
Rémi.
Note * vous pouvez vraisemblablement avoir des espaces avant si vous

écrivez :
fin = open('fichier.tex')
for line in fin:
line = line.lstrip() # ou même strip()
if ...
fin.close()

Avatar
remi

Le bout de code (goret) que j'avais posté ici ne convient pas?
(http://minilien.com/?XEbWMzm91x)


Oui, c'est très bien ça ! Merci. je l'avais inclus dans mon code.

Maintenant, j'aimerais, de la même manière, prélever le texte compris
entre deux section{Titre 1} et section{Titre 2}.

Je crois que je vais réutiliser ton code en mettant auparavant le
paragraphe à récupérer dans une commande du type texte{paragraphe à
récupérer}

Le ficheir source sera alors :
section{titre 1}

texte{paragraphe à récupérer}

section{2}

texte{...}

[...]


Peux-tu détailler le problème, dans ce cas?


L'idée générale est de transformer un fichier *.tex en *.sql pour qu'il
aille nourrir un base de type MySQL. C'est pour une FAQ.
Merci à tous.
Rémi (newbie).

Avatar
Denis Bitouzé
Le Sat, 12 Mar 2005 11:35:10 +0100
remi a écrit:

Je souhaiterais écrire un script qui prélève certaines zones de texte
dans un fichier.
Par exemple,

section{Titre 1}

texte à prélever et à stocker dans un fichier (numéro 1)

section{Titre 2}

texte à prélever et à stocker dans un fichier (numéro 2)


Si le fichier source est, comme ça semble être le cas, du (La)TeX,
pourquoi ne pas plutôt écrire :

texte à prélever et à stocker dans un fichier (numéro i)

dans un fichier totoi.tex

et, dans le fichier source, mettre :

section{Titre 1}

input{toto1}

section{Titre 2}

input{toto2}

--
Denis

Avatar
yves
On Sat, 12 Mar 2005 16:57:22 +0100, remi wrote:

Oui, c'est très bien ça ! Merci. je l'avais inclus dans mon code.

Maintenant, j'aimerais, de la même manière, prélever le texte compris
entre deux section{Titre 1} et section{Titre 2}.


Ah oui, pardon, c'est moi qui n'ait rien compris à ton premier
message.

Je crois que je vais réutiliser ton code en mettant auparavant le
paragraphe à récupérer dans une commande du type texte{paragraphe à
récupérer}


En fait, faut faire gaffe, ce code ne marche plus si il y a un retour
à la ligne dans le section{bla bla bla}

J'ai quelques idées hyper-gorettes pour ton problème (plus d'infos
demain).

--
Yves

Avatar
yves
On Sat, 12 Mar 2005 22:56:02 GMT,
(Yves) wrote:

J'ai quelques idées hyper-gorettes pour ton problème (plus d'infos
demain).


D'abord, une reprise du code de la discussion précédente:
il ne marche pas mieux, mais est plus concis.
Je n'ai pas parfaitement bien compris pourquoi il marche, il faudrait
lire en détail la documentation de findall:
#########################
# -*- coding: Latin-1 -*-
import re

file_in = open('in.tex','r')
truc = file_in.read()
file_in.close()

# attention, le code ci-dessous ne fonctionne pas si il
# existe un saut de ligne dans l'expression.
exp='\section{(.*)}'
motif = re.compile(exp)

print motif.findall(truc)
###############################

--
Yves

Avatar
yves
On Sun, 13 Mar 2005 10:05:10 GMT,
(Yves) wrote:

D'abord, une reprise du code de la discussion précédente:
il ne marche pas mieux, mais est plus concis.


ensuite, l'idée est de ramener le fichier latex en terrain mieux connu
(à parser) , à savoir du xml:

#########################
# -*- coding: Latin-1 -*-

import re

file_in = open('in.tex','r')
truc = file_in.read()
file_in.close()

# attention, le code ci-dessous ne fonctionne pas si il
# existe un saut de ligne dans l'expression.
exp='\section{.*}'
motif = re.compile(exp)

fic_transforme = motif.sub('</section>n<section>',truc)
output = open('fic_de_sortie.xml','w')
output.write('<?xml version="1.0"
encoding="ISO-8859-1"?>n<document>n<section>')
output.write(fic_transforme)
output.write('n</section>n</document>')
output.close()
###############################
et de traiter le fichier xml produit avec les outils pythons
appropriés:

######################
# -*- coding: Latin-1 -*-

from xml.dom import minidom

xmldoc = minidom.parse('fic_de_sortie.xml')

sects = xmldoc.getElementsByTagName('section')

a=0
for i in sects:
print a
print i.firstChild.data.encode('latin-1')
# print type(i.firstChild.data)
a+=1
##################################
ou:
##############################
# -*- coding: Latin-1 -*-

from xml.dom import minidom

xmldoc = minidom.parse('fic_de_sortie.xml')

sects = xmldoc.getElementsByTagName('section')

a=0
for elt in sects:
print a
blo = elt.firstChild.data.encode('latin-1')
print blo.strip()
# print type(i.firstChild.data)
a+=1
###################################

Peut-être ça vaut le coup de googler latex2xml, par exemple. Je n'ai
rien trouvé en python (mais après juste une recherche rapide).
--
Yves

Avatar
remi
Bonjour,

On Sun, 13 Mar 2005 10:05:10 GMT,
(Yves) wrote:


D'abord, une reprise du code de la discussion précédente:
il ne marche pas mieux, mais est plus concis.



ensuite, l'idée est de ramener le fichier latex en terrain mieux connu
(à parser) , à savoir du xml:
[...]


Très bonne idée je pense ! (amha de newbie !)
En plus, le fichier in.tex est assez simple (que du texte, pas de
formules ni d'images).
Merci beaucoup pour vos propositions !
Je reviens vers vous après tests et documentation.
Rémi.


1 2