Sujet: Re: Optimisation
De: philippe.lotton (l' arobase) gmail.com (pil91)
Groupes: fr.comp.lang.python
Organisation: http://groups.google.com
Date: 13. Sep 2008, 08:29:28
On 12 sep, 17:42, Alain BARTHE <alain.barthe...@free.fr> wrote:
Alain BARTHE a écrit :
Bruno Desthuilliers a écrit :
Alain BARTHE a écrit :
(snip)
Je pense que tu pourrais aussi utiliser le module struct, qui semble
mieux adapté pour ton problème.
doh :(
C'est ça le problème avec Python : y a tellement de trucs dans la
biblio standard qu'on oublie fréquemment de vérifier si y a pas déjà
une bonne soluce quelque part...
Principe :
- définir une format décrivant la structure de tes enregistrements:
Exemple : Si ton enregistrement contient :
nom 30 caractères
prenom 20 caractères
tel 10 entiers
Je me suis planté dans la syntaxe du format : 10i indique un tableau de
10 entiers codés en binaire selon la plateforme (4 octets sur ma machine)
On peut utiliser hHiIlL (pour short, int, long signés ou non) et même
précéder de @=<> pour préciser les types de plateformes et d'endianess.
Tu crées un format = "30s20s10i"
import struct
format = "30s20s10i"
size = struct.calcsize (format)
in = open ("fichier.dat", "r")
out = open ("fichier.csv", "w")
while f:
data = in.read (size)
Attention, s'il y a des newlines en fin d'enregistrement, il faut en
tenir compte dans la taille (et probablement dans le struct), en
tenant compte des problèmes de portabilité entre plateformes pour le
format des newlines.
On peut ajouter le motif x (padding) dans le format pour prendre en
compte le \n ou même ignorer un champ dont on n'a pas besoin.
nom, prenom, tel = struct.unpack (format, data)
print >> out, "%s,%s,%d;", % (nom,prenom,tel)
in.close()
out.close()
(snip)
Par contre, je ne sais pas si ce sera plus efficace.
<OP>
Pil, si tu tentes cette solution, je veux bien savoir le résultat (si
ça fonctionne pour ton cas, et si oui si c'est plus performant).
</OP>
Concernant le fonctionnement, je pense que ça correspond bien avec son
problème. Je n'ai pas pu tester réellement car je n'avais pas le temps
de me créer un fichier de test, mais le module semble fait pour.
Pour les perf, j'espère que ça doit être meilleur, le module semble être
un .so dont probablement être écrit en C et la découpe des divers champs
devrait être plus efficace qu'avec du code Python.
A confirmer quand même.
Juste un msg pous vous dire que je suis le fil, que vous enrichissez.
Je n'ai pas eu beaucoup de temps, mais je reprends tout ça la semaine
prochaine et je vous fait remonter les résultats.
Bon week-end