IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Python, créer un fichier binaire brut


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Python, créer un fichier binaire brut
    Bonjour à tous,
    Avec Python 3.8, je souhaite créer un fichier d'octets brut. Disons par exemple les nombres de 0 à 15, chacun occupant 1 seul octet.
    Les modules Pickle ou Struct ne me paraissent pas convenir, à cause des infos de codage intégrées au fichier. Dans mon exemple, le fichier dont j'ai besoin devrait occuper 16 octets, pas un de plus. Ça devrait être possible, mais je n'y arrive pas .
    Et puis aussi, bien sûr, je voudrais pouvoir relire mes octets...
    Merci de bien vouloir m'expliquer comment procéder. Bonne journée à tous.

  2. #2
    Invité
    Invité(e)
    Par défaut J'ai la solution !
    Rebonjour à tous,
    J'ai fini par créer un fichier de 256 octets, de H00 à HFF, et je peux relire les valeurs, avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    a = ""
    for i in range(256):
    	a = a + chr(i)
    with open ("FicByte", "wb") as f:
    	f.write(bytes(a,"Latin-1"))
     
    with open ("FicByte", "rb") as f:
    	while 1:
    		a = f.read(1)
    		if not a:
    			break
    		else:
    			print(ord(a.decode("Latin-1")))
    Merci de ne plus tenir compte de mon message.
    Dernière modification par Delias ; 28/09/2020 à 13h46.

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Bravo pour avoir trouvé une solution tout seul.

    Néanmoins, si on part sur un fichier binaire (ou une séquence d'octets) pas besoin d'essayer de transformer son contenu en "texte" et appliquer encoding/decoding:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    with open ("FicByte", "wb") as f:
    	f.write(bytes(range(256)))
     
    with open ("FicByte", "rb") as f:
           for a in f.read():
                print(a)
    Ce qui simplifie quand même le code...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Invité
    Invité(e)
    Par défaut Fichiers binaires
    Merci beaucoup pour tes conseils ! Ta solution est légère et élégante ! (Il y en a qui vont se demander de qui je parle...)
    J'ai essayé de la transposer à mon cas réel (puisque la suite de 00H à FFH était un exemple).
    Je pars d'une liste d'entiers aléatoire (tous inférieurs à 256) et je dois créer le fichier correspondant.
    J'ai essayé le code ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # lst = [14, 45, 8, 127]
    # with open ("D:/PYTHON/MesProgrammes/ESSAIS/FicByte", "rb") as f:
    # 	for elt in lst:
    # 		f.write(bytes(elt))
    Et il plante sur le write. Apparemment, l'entier elt ne convient pas là où il attend un range. Pourrait-on transformer ma liste en objet range ?
    Ou alors y a-t-il un autre moyen de prendre ta solution ? En tout cas, merci de ta réponse.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par gdegas Voir le message
    J'ai essayé le code ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    lst = [14, 45, 8, 127]
    with open ("D:/PYTHON/MesProgrammes/ESSAIS/FicByte", "rb") as f:
     	for elt in lst:
    		f.write(bytes(elt))
    Et il plante sur le write. Apparemment, l'entier elt ne convient pas là où il attend un range. Pourrait-on transformer ma liste en objet range ?
    bytes(n) où n est un entier va créer une séquence de n bytes égaux à zéro.
    Pourquoi ne pas faire bytes(lst) tout simplement?

    Après, si vous voulez écrire dans un fichier, il faut l'ouvrir autrement qu'en lecture seule... et normalement le message d'erreur indique l'erreur (çà ne fait pas que "râler" et "planter").

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Invité
    Invité(e)
    Par défaut
    Vous avez raison ! Erreur grossière de ma part...

Discussions similaires

  1. créer un fichier en python et l'enregistrer sur le disque
    Par nancy maman dans le forum Général Python
    Réponses: 7
    Dernier message: 11/04/2011, 09h46
  2. Comment créer un fichier binaire avec ces codes
    Par zslovefr dans le forum C++/CLI
    Réponses: 1
    Dernier message: 02/07/2009, 20h34
  3. Accès à des fichiers binaires en Python
    Par dapounet dans le forum Général Python
    Réponses: 5
    Dernier message: 01/04/2009, 22h08
  4. Créer un fichier binaire
    Par ouinad dans le forum 4D
    Réponses: 5
    Dernier message: 05/11/2008, 10h33
  5. créer un fichier vidéo a partir des images binaires
    Par jack_1981 dans le forum Langage
    Réponses: 4
    Dernier message: 17/11/2006, 19h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo