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...