#1 Le 20/07/2017, à 18: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, à 12:54)
Hors ligne
#2 Le 20/07/2017, à 19: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, à 21: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, à 21:50)
Hors ligne
#4 Le 21/07/2017, à 05: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, à 06:32)
Hors ligne
#5 Le 21/07/2017, à 07:37
- paul18
Re : [Résolu] Python : fichier ascii avec données au format binaire
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, à 07: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, à 08: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, à 11: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, à 12: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)
Je vais pouvoir lancer de nouveaux essais
Merci pour le coup de main
Paul
Hors ligne