Contenu | Rechercher | Menus

Annonce

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Pour en savoir un peu plus sur l'équipe du forum.

Appel à contributeurs pour la doc.

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

#1 Le 20/07/2017, à 19:50

paul18

[Résolu] Python : fichier ascii avec données au format binaire

Bonsoir,

J'utilise maintenant python/numpy pour écrire lire et traiter des données dans des fichiers ascii, et en écrire un nouveau fichier (toujours ascii) qui sera lu par un interpréteur. Pour gagner en temps de lecture, j'ai la possibilité d'écrire une grande partie des données (int et float) directement en binaire genre "sizeof" du C (je ne connais que très peu le C).

Je n'ai pas vu sur internet d'instruction simple pour cette conversion, mais je ne sais pas où chercher: est-ce possible sous python? si oui où regarder?

Merci

Paul

Dernière modification par paul18 (Le 21/07/2017, à 13:54)

Hors ligne

#2 Le 20/07/2017, à 20:30

pingouinux

Re : [Résolu] Python : fichier ascii avec données au format binaire

Bonsoir,
Tu peux regarder dans la doc du module struct, notamment les fonctions pack et unpack.

Hors ligne

#3 Le 20/07/2017, à 22:28

paul18

Re : [Résolu] Python : fichier ascii avec données au format binaire

merci pour la piste. Du coup je suis tombé aussi sur "bytes"

Par contre pour l'écriture, j'ai vu qu'il fallait déclarer la partie binaire comme un string: est-ce la bonne façon de procéder car j'ai un gros doute (j'ai fait un essai avec 1 million de lignes et le fichier ascii/binaire et plus gros qu'un simple 100% ascii?

import numpy as np
import os
import struct

PATH = str(os.path.abspath(''))
file = '/test_linaire.txt'

a = np.arange(1,5)
n = len(a)

with open(PATH + file, 'w') as f:
   for i in range(n):
       f.write("a = %s\n" %(struct.pack('l',a[i]))) ## l = entier sur 4 bits <> d = float en double
#       f.write("a2 = %s\n" %(bytes(a[i])))

ce qui donne

a = b'\x01\x00\x00\x00'
a = b'\x02\x00\x00\x00'
a = b'\x03\x00\x00\x00'
a = b'\x04\x00\x00\x00'

Dernière modification par paul18 (Le 20/07/2017, à 22:50)

Hors ligne

#4 Le 21/07/2017, à 06:09

pingouinux

Re : [Résolu] Python : fichier ascii avec données au format binaire

Remarque : Le résultat est déjà de type str

PATH = os.path.abspath('')

Il faut écrire directement en binaire sur le fichier :

with open(PATH + file, 'wb') as f:
   for i in range(n):
       f.write(struct.pack('l',a[i]))

Ajouté :
Pour les entiers, tu as aussi ces 2 fonctions : int.to_bytes, int.from_bytes

Dernière modification par pingouinux (Le 21/07/2017, à 07:32)

Hors ligne

#5 Le 21/07/2017, à 08:37

paul18

Re : [Résolu] Python : fichier ascii avec données au format binaire

pingouinux a écrit :
with open(PATH + file, 'wb') as f:
   for i in range(n):
       f.write(struct.pack('l',a[i]))

Ajouté :
Pour les entiers, tu as aussi ces 2 fonctions : int.to_bytes, int.from_bytes

en 'wb' le fichier est entièrement binaire, mais ce n'est pas ce que je cherche à faire ; je cherche à mélanger ascii et binaire dans un même fichier

with open(PATH + file, 'w') as f:

   for i in range(n):

       f.write("En-tete ascii et ensuite bloc en binaire")

       f.write(struct.pack('l',a[i])) ## l = entier sur 4 bits <> d = float en double

   f.write("fin bloc binaire")

Hors ligne

#6 Le 21/07/2017, à 08:55

pingouinux

Re : [Résolu] Python : fichier ascii avec données au format binaire

Peut-être ceci ?

with open(PATH + file, 'wb') as f:

   for i in range(n):

       f.write(b"En-tete ascii et ensuite bloc en binaire")

       f.write(struct.pack('l',a[i])) ## l = entier sur 4 bits <> d = float en double

   f.write(b"fin bloc binaire")

Hors ligne

#7 Le 21/07/2017, à 09:49

paul18

Re : [Résolu] Python : fichier ascii avec données au format binaire

merci Pingouinux

effectivement ça fonctionne mieux; en revanche je m'attendais à avoir un fichier binaire de plus petite taille que l'équivalent en ascii et ce n'est pas le cas. Est-ce dans le choix des entiers (long ici)  ? je continue à creuser


import os
import struct
import binascii

PATH = str(os.path.abspath(''))
file = '/test_binaire.txt'
file2 = '/test_ascii.txt'

a = np.arange(1,1000000)
n = len(a)


with open(PATH + file, 'wb') as f:
   f.write(b"En-tete ascii et ensuite bloc en binaire\n")
   for i in range(n):
     f.write(struct.pack('l',a[i])) ## l = entier sur 4 bits <> d = float en double
     f.write(b"\n")
   f.write(b"fin bloc binaire\n")

with open(PATH + file2, 'w') as g:
  g.write("En-tete ascii et ensuite bloc en ascii\n")
  for i in range(n):
    g.write("%d\n" %a[i])
  g.write("fin bloc ascii\n")

Hors ligne

#8 Le 21/07/2017, à 12:29

pingouinux

Re : [Résolu] Python : fichier ascii avec données au format binaire

Est-ce dans le choix des entiers (long ici)  ?

Oui.
Dans ton fichier binaire, chaque entier occupe 8 octets, tandis que dans ton fichier ascii, un entier occupe un nombre d'octets égal à son nombre de chiffres (entre 1 et 6 ici).

Hors ligne

#9 Le 21/07/2017, à 13:57

paul18

Re : [Résolu] Python : fichier ascii avec données au format binaire

autant pour moi, j'ai mal calculer les bornes de l'ensemble de définition (sous 4 octets j'ai +/- 2 milliard contre +/- 9.E-19 sur 8 octets) tongue
Je vais pouvoir lancer de nouveaux essais
Merci pour le coup de main
Paul

Hors ligne