Comment liste de sortie de flotte à un fichier binaire en Python
J'ai une liste de valeurs à virgule flottante en Python:
floats = [3.14, 2.7, 0.0, -1.0, 1.1]
Je voudrais écrire ces valeurs dans un fichier binaire en utilisant la norme IEEE de 32 bits de codage. Quelle est la meilleure façon de le faire en Python? Ma liste contient environ 200 MO de données, donc quelque chose de "pas trop lent" serait mieux.
Comme il y a 5 valeurs, je veux juste un de 20 octets du fichier de sortie.
- Votre tableau est manquant points-virgules entre les numéros.
Vous devez vous connecter pour publier un commentaire.
Alex est tout à fait juste, il est plus efficace de faire de cette façon:
Et ensuite lire le tableau comme ça:
array.array
les objets ont également un.fromfile
méthode qui peut être utilisé pour lire le fichier, si vous connaissez le nombre d'éléments à l'avance (par exemple, de la taille du fichier, ou un autre mécanisme)for row in myArray:
) puisstruct.pack
ing larow
.Voir: Python struct module
with
de la syntaxe.dict
s de fichier JSON (22K) et l'emballage de 3,2 M de la table de flotteurs semblait négligeable. C'est, réponse à la console ne semble pas de décalage entre les deux opérations. @AlexMartelli: à mon humble avis, "Mieux" est totalement subjective. Il y a des qualifications manque dans cette affirmation.Le tableau du module de la bibliothèque standard, peut-être plus adapté pour cette tâche que la struct module de laquelle tout le monde est en train de suggérer. Performance avec 200 MO de données doit être sensiblement mieux avec le tableau.
Si vous souhaitez emmener à une variété d'options, essayez le profilage sur votre système avec quelque chose comme ceci
Je ne suis pas sûr de savoir comment NumPy permettra de comparer les performances de votre application, mais il peut être utile de l'examiner.
À l'aide de NumPy:
résultats dans un de 20 octets fichier.
ont un coup d'oeil à
struct.pack_into
struct.pack() ressemble à ce que vous avez besoin.
http://docs.python.org/library/struct.html
J'ai rencontré un problème similaire, tandis que, par inadvertance, la rédaction d'un+ de 100 GO de fichier csv. Les réponses données ici ont été extrêmement utiles, mais, pour aller au fond d'elle, Je profilé toutes les solutions mentionnées, et puis certains. Toutes les exécutions de profilage ont été faites sur un 2014 Macbook Pro avec un SSD à l'aide de python 2.7. À partir de ce que je vois, la
struct
approche est certainement le plus rapide à partir d'un point de vue des performances:Ma "réponse" est vraiment un commentaire sur les différentes réponses. Je ne peux pas commenter car je n'ai pas de 50 points de réputation.
Si le fichier est lu par Python, puis utilisez le "cornichon" module. Cet outil peut lire et écrire beaucoup de choses en binaire.
Mais la façon dont la question est posée, en disant: "de l'IEEE de 32 bits de codage", il semble que le fichier sera lu dans d'autres langues. Dans ce cas, l'octet de commande doit être spécifié. Le problème est que la plupart des machines x86, avec little-endian d'ordre des octets, mais le nombre de données le traitement de la langue est Java/JVM, à l'aide de la big-endian ordre des octets. De sorte que le Python "tofile()" va utiliser C, qui utilise little endian en raison de l'existence de la machine little-endian, et puis le code de traitement de données sur Java/JVM va décoder à l'aide de big endian, conduisant à l'erreur.
De travailler avec la JVM:
Sur le Java côté:
Le problème maintenant, c'est le Python
'f'*len(f)
code - espérons-le, l'interprète ne fait pas de créer un super long "ffffff..." chaîne de caractères.Je voudrais utiliser un tableau numpy et byteswap