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 :
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
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()
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 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()
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 ?
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
A moins que quelque chose ne m'échappe peut-être par rapport à l'utilisation de toutes ces fonctions et de leur contexte...
Partager