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