IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Problème de découpage sur fichier


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 12
    Par défaut Problème de découpage sur fichier
    Bonjour,

    J'utilise actuellement sur des très gros fichiers (1GB+), et je cherche donc à travailler sur ceux-ci à l'aide d'une technique de découpage, donc d'analyse de mini-fichiers construits au fur et au mesure à partir du 'gros'.

    Mon problème réside dans la fonction tell() qui semble ne pas fonctionner correctement quand on travaille ligne par ligne.

    En effet, à la fin, mon mini-fichier 'construit' ne commence ni ne finit à l'endroit où il devrait l'être d'après ce que j'ai indiqué dans le code (c'est-à-dire que les f.tell() concernés donnent une mauvaise 'coordonnée' (Bytes) pour la ligne en question indiquée et où le découpage doit commencer à s'effectuer).

    L'idée est que le fichier est parsé ligne par ligne à la recherche d'un texte en particulier, et à partir duquel je vais indiquer la position pour commencer à constuire le mini-fichier. De même, un nouveau texte particulier va être trouvé qui indiquera la position de fin du futur fichier en question. Ces 'prises de position' sont évidemment effectuées à l'aide de la fonction tell().

    Au bout du compte, je reviens sur mon fichier d'origine et indique l'endroit du fichier à partir duquel doit s'effectuer un read() pour une valeur diffVal = tell()_de_fin - tell()_de_début. J'ai donc miniFile = file.read(diffVal) qui correspond à la partie du file d'origine qui va être traité ensuite...

    Mon code est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
            file = open(xml, 'r')
            xPresence = True
            finalPos = 0
     
            #On va créer des mini-fichiers en fonction à la présence d'un 'texte',
            #chaque itération correspond à un trunking pour ce mini-fichier
            while xPresence :
     
                            # Hypothèse qu'à priori le texte n'est pas présent
    			xPresence = False
     
                            # Replacement du curseur pour poursuivre le parsing
    			file.seek(finalPos)
    			for line in file :
    				if '<XYZ>' in line :
                                            # le texte a été trouvé, on note la position
    					initPos = file.tell()
    					xPresence = True
    				if '</XYZ>' in line :
    					if xPresence :
                                                    # la fin de la partie concernée trouvée,
                                                    # on note également la position
    						finalPos = file.tell()
    						break		
    			if xPresence :
                                    #on calcule le nombre de Bytes à 'read()' par le fichier
    				partSize = finalPos - initPos
                                    #on positionne le curseur au commencement de la
                                    #partie intéressée sur le fichier
    				file.seek(initPos)
                                    #on crée le mini-string en question
    				string = file.read(partSize)
    			else :
    				break
     
                            traitement_sur_string_construit()
    J'ai réalisé un test avec un fichier simple de quelques lignes, et je m'aperçois également de la même erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    text = "bababababa\nfudududydy\nkdksiIQSqusQSU\NQSPODQSOIDUQOIDUUOSD\nIZUZUYRY3"
    testFile = open('testLine.txt', 'w')
    testFile.writelines(text)
    testFile.close()
    print 'len(texte)', len(text)
    testRead = open('testLine.txt', 'r')
    for line in testRead :
    	print line
    	print testRead.tell()
    testRead.close()
    La réponse correspond à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    len(texte) 68
    bababababa
     
    71
    fudududydy
     
    71
    kdksiIQSqusQSU\NQSPODQSOIDUQOIDUUOSD
     
    71
    IZUZUYRY3
    71
    Pourquoi le tell() m'indique-t-il toujours un nombre de bytes ('coordonnée') '71' alors que je suis à une ligne différente à chaque fois ?

    A moins que quelque chose ne m'échappe peut-être par rapport à l'utilisation de toutes ces fonctions et de leur contexte...

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonjour,

    c'est à cause du buffer de lecture. tell() t'indique où est le buffer et pas où toi tu en es

    pour éviter ce genre de soucis, on peut calculer soit même la position dans le fichier, par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for line in fobj:
       pos += len(line)
    dans ce cas, je te conseille de lire le fichier en mode "rb".

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 12
    Par défaut
    Un grand merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 07/06/2008, 21h20
  2. [PC-MF] Problème de delete sur fichier indexé
    Par sharcky dans le forum Cobol
    Réponses: 4
    Dernier message: 14/01/2008, 15h35
  3. Problème d'include sur fichier extérieur
    Par zooffy dans le forum ASP
    Réponses: 7
    Dernier message: 29/11/2007, 16h28
  4. Problème de lecture sur fichier ini.
    Par braoru dans le forum Delphi
    Réponses: 2
    Dernier message: 28/07/2006, 15h34
  5. Probléme d'accès sur fichier PARADOX
    Par Debure dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/01/2006, 13h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo