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.