OVH Cloud OVH Cloud

Lecture de fichier txt

6 réponses
Avatar
Vincent M
Bonjour,

J'essaie de récupérer des données d'un fichier texte pour alimenter une
liste.
Voici le code que j'utilise :

while order.readline()!='\n':
recuptxt = order.readline()
if recuptxt!='\n':
vartxt=recuptxt.split("~")
art.append(vartxt [1])

Le problème c'est que ça récupère seulement 1 ligne sur 2 !

Par contre si je fais autant de fois qu'il y a des lignes :

recuptxt = order.readline()
vartxt=recuptxt.split("~")
art.append(vartxt [1])

Là ça marche !

Merci de votre aide

Vincent

6 réponses

Avatar
CptPicard
C'est en fait assez normal que vous n'ayez qu'1 ligne sur 2: Le premier
appel à readline lit une ligne du fichier mais l'oublie car non stockée dans
une variable intermédiaire (order.readline()!='n'); le second appel lit la
ligne suivante mais cette fois-ci, elle est stockée dans une variable
intermédiaire (recuptxt = order.readline()).
De plus, votre programme ne marchera pas si la ligne ne contient pas le
caractère '~':

toto= 'hello'
vartxt = toto.split('~')
print vartxt[1]
Traceback (most recent call last):



File "<stdin>", line 1, in ?
IndexError: list index out of range

La ligne qui suit devrait fournir la réponse à votre problème. Je ne l'ai
pas testé mais ça devrait marcher.

art = [recuptxt.split("~")[1] for recuptxt in order.readline() if
recuptxt.find('~')!=-1]


"Vincent M" wrote in message
news:411df266$0$24531$
Bonjour,

J'essaie de récupérer des données d'un fichier texte pour alimenter une
liste.
Voici le code que j'utilise :

while order.readline()!='n':
recuptxt = order.readline()
if recuptxt!='n':
vartxt=recuptxt.split("~")
art.append(vartxt [1])

Le problème c'est que ça récupère seulement 1 ligne sur 2 !

Par contre si je fais autant de fois qu'il y a des lignes :

recuptxt = order.readline()
vartxt=recuptxt.split("~")
art.append(vartxt [1])

Là ça marche !

Merci de votre aide

Vincent




Avatar
Rémi
Vincent M wrote:

Bonjour,

J'essaie de récupérer des données d'un fichier texte pour alimenter une
liste.
Voici le code que j'utilise :

while order.readline()!='n':
recuptxt = order.readline()
if recuptxt!='n':
vartxt=recuptxt.split("~")
art.append(vartxt [1])


Pourquoi n'utilises tu pas readlines ? (avec un "s" à la fin),
elle te retourne une liste de lignes.
Après tu n'as plus qu'à faire ton traitement.

for line in open("File.txt","r").readlines():
print line



Le problème c'est que ça récupère seulement 1 ligne sur 2 !

Par contre si je fais autant de fois qu'il y a des lignes :

recuptxt = order.readline()
vartxt=recuptxt.split("~")
art.append(vartxt [1])

Là ça marche !

Merci de votre aide

Vincent


Avatar
Vincent M


Pourquoi n'utilises tu pas readlines ? (avec un "s" à la fin),
elle te retourne une liste de lignes.
Après tu n'as plus qu'à faire ton traitement.

for line in open("File.txt","r").readlines():
print line





C'est effectivement ce que j'ai fait :

recuptxt = order.readlines()
for i in range(len(recuptxt)):
detail.append(recuptxt[i][:-1].split("~"))

Merci

Avatar
TRAMIER Blaise
Vincent M wrote:

C'est effectivement ce que j'ai fait :

recuptxt = order.readlines()
for i in range(len(recuptxt)):
detail.append(recuptxt[i][:-1].split("~"))


Oui, mais tu te compliques la vie inutilement. Si la notation
"for line in open("File.txt","r").readlines():" te gènes, tu peux la
décomposer un peu;
recuptxt = order.readlines()
for line in recuptxt:
detail.append(line[:-1].split("~")

Cependant je ne vois pas l'intérêt du "order" initial.

Cordialement

Avatar
LioneL
Vincent M wrote:
recuptxt = order.readlines()
for i in range(len(recuptxt)):
detail.append(recuptxt[i][:-1].split("~"))


Oui, mais tu te compliques la vie inutilement. Si la notation
"for line in open("File.txt","r").readlines():" te gènes, tu peux la
décomposer un peu;
recuptxt = order.readlines()
for line in recuptxt:
detail.append(line[:-1].split("~")


on peux aussi écrire directement

for line in open("fichier.txt"; "r"):
detail.append(line[:-1].split("~")

Lionel
--
Python facile : http://lionel.grolleau.free.fr/
Les ressources (liens) en français sur Python.
Python et l'unicode ou comment afficher les caractères accentués dans un
terminal 'DOS'.


Avatar
CptPicard
"LioneL" wrote in message
news:
Vincent M wrote:
recuptxt = order.readlines()
for i in range(len(recuptxt)):
detail.append(recuptxt[i][:-1].split("~"))


Oui, mais tu te compliques la vie inutilement. Si la notation
"for line in open("File.txt","r").readlines():" te gènes, tu peux la
décomposer un peu;
recuptxt = order.readlines()
for line in recuptxt:
detail.append(line[:-1].split("~")


on peux aussi écrire directement

for line in open("fichier.txt"; "r"):
detail.append(line[:-1].split("~")

Lionel


Ce bout de code ne marche pas si la dernière ligne ne comporte pas un
passage à la ligne.
De plus, cela ne correspond pas au code initial de Vincent M qui ne prenait
que le mot suivant la première occurence de ~.

--
Python facile : http://lionel.grolleau.free.fr/
Les ressources (liens) en français sur Python.
Python et l'unicode ou comment afficher les caractères accentués dans un
terminal 'DOS'.