Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 07/07/2017, à 09:24

paul18

[résolu] problème avec Readline()

Bonjour,

Désolé si ma question est triviale, mais je suis bloqué dessus depuis des heures & tous les exemples trouvés (idem dans les docs) fonctionnent pour le parcours complet d'un fichier.

Mon problème : je cherche à enregistrer la valeur sur la ligne juste après ##begin, mais de de toute évidence lors de son appel, readline() démarre au début du fichier (je n'ai donc pas compris son fonctionnement)

Une remarque : de gros fichiers textes à traiter, donc readlines() est à éviter (testé :-) )

Merci par avance pour toute suggestion

Paul


fichier ascii :

999
0
0
0
0
0
0
0
0
0
0
##BEGIN
42
1
6
12
47
2
46
3
51

Mon bout de code :

import time, sys, os
#from astropy.io import ascii
import itertools
import numpy as np

PATH = str(os.path.abspath(''))
input_file_name ='/tmp.txt'


## check if the file exists, then if it's empty or not
if (os.path.isfile(PATH + input_file_name)):
    if (os.stat(PATH + input_file_name).st_size > 0):
        
        ## go through the file in order to find specific sentences
        ## specific blocks will be defined afterward         
        Block_position = []; j=0;
        with open(PATH + input_file_name, "r") as data:
            for line in data:
                if '##BEGIN' in line:
                    Block_position.append(j)
                j=j+1 
           
        with open(PATH + input_file_name, "r") as data:
            TotalNumberOfLines = os.path.getsize(PATH + input_file_name)
            
            for j in range(TotalNumberOfLines):
                print ("j = ",j)
                if (j is (Block_position[0]+1)):
                    print( "je suis dedans\n"); print(j)
                    NumberOfNodes = int(data.readline()[:-1])
                j = j+1

       
    else:
        print "The file %s is empty : post-processing cannot be performed !!!\n" % input_file_name

            
else:
    print "Error : the file %s does not exist: post-processing stops !!!\n" % input_file_name

Dernière modification par paul18 (Le 07/07/2017, à 12:02)

Hors ligne

#2 Le 07/07/2017, à 09:53

paul18

Re : [résolu] problème avec Readline()

je suis tombé sur itertools.islice(), mais ça répond partiellement à mon besoin; avec readline() je cherche à récupérer la valeur et directement l'écrire dans un fichier texte (sans charger un bloc complet en mémoire)

NumberOfNodes = int(next(itertools.islice(data,Node_position[0]+1,Node_position[0]+2),None))

Hors ligne

#3 Le 07/07/2017, à 10:01

pingouinux

Re : [résolu] problème avec Readline()

Bonjour,
Ton problème vient de ce que tu n'appelles data.readline() que lorsque tu arrives à j==12. Tu ne lis donc que la première ligne.
Ce que tu fais est beaucoup trop compliqué. Je ferais simplement ceci :

        with open(PATH + input_file_name, "r") as data:
            while True:
                line=data.readline()
                if line=='': break
                if '##BEGIN' in line:
                    NumberOfNodes = int(data.readline()[:-1])
                    print( NumberOfNodes);

Hors ligne

#4 Le 07/07/2017, à 10:31

paul18

Re : [résolu] problème avec Readline()

évidemment ça fonctionne, mais je suis perdu car dans mon esprit on est sur la ligne ###begin (avec if) et je n'arrive pas à comprendre qu'on enregistre la ligne suivante (????)

bon il y a plus de choses à revoir que je n'imaginais

Merci pour l'information

Paul

Hors ligne

#5 Le 07/07/2017, à 10:35

pingouinux

Re : [résolu] problème avec Readline()

évidemment ça fonctionne, mais je suis perdu car dans mon esprit on est sur la ligne ###begin (avec if) et je n'arrive pas à comprendre qu'on enregistre la ligne suivante (????)

Quand on lit une ligne contenant '##BEGIN', on fait un data.readline() pour lire la ligne suivante.

                if '##BEGIN' in line:
                    NumberOfNodes = int(data.readline()[:-1])

Hors ligne

#6 Le 07/07/2017, à 12:03

paul18

Re : [résolu] problème avec Readline()

@pinguinux: un grand merci ; c'est parfois dans la douleur qu'on apprend les choses wink

j'ai avancé d'un grand pas

Paul

Hors ligne