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 :

[Fichiers] Lire byte à byte


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut [Fichiers] Lire byte à byte
    Bonjour,

    J'ai un fichier dans lequel j'écris des nombres de 1 à 54. Plus tard dans mon programme, je veux accéder à nouveau à ce fichier afin d'y lire les nombres écrits. Je voudrais lire le fichier octets par octets afin de récupérer les nombres en entier, car pour le moment je récupère un 1 et un 7 à la place de 17.

    Voilà le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    f= open(getcwd()+'/clef.bk','r')
    i = 1
    while 1:
    	f.seek(i)
    	b = f.read(1)
    	if b == '':
    		break
    	if b != '':
    		print b
    	i+=1
    Edit : En fait, c'est surtout la façon dont j'écris les données qui pose problème en fait. Quand j'écris dans mon fichier, je voudrais écrire des int, et non pas des str(int). Comment faire en python ?
    Dernière modification par Invité ; 13/01/2010 à 09h48.

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonjour,

    je ne comprends pas. ton fichier ressemble à ça:

    ou à ça:

    et c'est un fichier 'ascii' ou un fichier 'binaire' ? tu as écris le fichier avec:

    ou

    Si ton fichier ressemble au premier (et donc écrit en ascii), voici comment le lire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for line in open("toto",'r'):
        line = line.rstrip('\r\n')
        number = int(line)

  3. #3
    Invité
    Invité(e)
    Par défaut
    Non justement, je souhaite écrire tout à la suite, puis récupérer mes valeurs par la suite.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Il faut que tu essayes d’ouvrir en mode dit binaire: ’rb’

    Je ne sais pas en quoi consiste exactement ce mode. D’après ce que j’ai compris, ça force le système à lire vraiment caractère par caractère (c'est a dire octet pat octet ?). Je l’utilise pour analyser des textes, quand on veut pouvoir lire ce qu’il y a exactement dans un fichier. En effet, Python transforme automatiquement les fins de ligne ’\r\n’ en ’\n’ quand il en rencontre dans un texte. Être en mode ’rb’ permet d’obtenir vraiment ’\r\n’ dans la chaîne réceptrice de la lecture d’un fichier et de savoir donc où on en est exactement.

    Mais ça , ça concerne des fichiers de caractères.

    Pour un fichier dans lequels ont été enregistrés des nombres, je ne sais pas ce que ça donne d’utiliser ’rb’.

    Je ne sais d’ailleurs pas s’il est possible d’enregistrer des nombres sous une autre forme qu’en tant que caractères. Je pense que oui parce que je crois me rappeler qu’il y a eu une file il n’y a pas si longtemps qui a porté sur ce même problème d’analyse d’un fichier de nombres.
    C’est un sujet que je ne maîtrise pas.



    Peux tu nous fournir un tel fichier ? Qu’on essaie directement et voient ce que ça donne, stp



    Peux tu nous dire aussi comment tu crées ton fichier de nombres ?


    EDIT

    J’ai aussi l’impression que tu devrais aller voir du coté de la Data Persistence: pickle, cPickle, shelve, marshal, ...

    12.5. marshal
    This module contains functions that can read and write Python values in a binary format.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Hé bien justement, c'est tout le problème. Je voudrais à la fois créer ce fichier et le lire par la suite. Je peux facilement contourner le problème en méttant chaque nombre sur une ligne différent, donc mon problème n'en est pas vraiment un, mais je me suis posé la question du coup.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 41
    Par défaut
    code vite fait mais sans complications
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    f = open('Fichier', 'r')
    ff = f.read()
    ff = ff.split(';') #en supposant que les nombres sont séparés par des ;
    # ff est maintenant une liste
    print ff[0]
    1

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bon changement de décor. j'ai un fichier, peu importe lequel, texte, image, video, peu importe. Je souhaite lire le fichier, mais octet par octet, et écrire dedans des octets et pas des valeurs. Je sais pas si je me fais bien comprendre ?

  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    La lecture et l'écriture dans des fichiers binaires peut se faire sous forme de string Python, (méthodes read & write de l'objet file). La méthode seek peut être utile pour manipuler des fichiers binaires. Mais pour donner un sens à ces données, il faut les convertir en type de données Python. Les modules array et struct sont utiles pour cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> l = [1,2,3]
    >>> from array import array
    >>> array('B',l)    # B indique un encodage sous forme d'un octet non signé (unsigned char en C)
    array('B', [1, 2, 3])
    >>> array('B',l).tostring()
    '\x01\x02\x03'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> import struct
    >>> f = open('test.wav','rb')
    >>> RIFF_header = f.read(12)
    >>> RIFF_header
    'RIFF\x9e8\x03\x00WAVE'
    >>> struct.unpack('4sl4s', RIFF_header)
    ('RIFF', 211102, 'WAVE')

Discussions similaires

  1. lire les bytes d'un fichier:ifstream vs FILE.
    Par alex.buisson dans le forum Langage
    Réponses: 6
    Dernier message: 21/03/2012, 15h06
  2. lire une fichier dans un byte[]
    Par azstar dans le forum C#
    Réponses: 10
    Dernier message: 05/08/2010, 16h41
  3. Lire les Bytes brut du protocole IP sur TCP
    Par Tleconte dans le forum Delphi
    Réponses: 1
    Dernier message: 21/05/2006, 02h32
  4. [PERL] lire un fichier bytes à bytes
    Par LE NEINDRE dans le forum Langage
    Réponses: 1
    Dernier message: 09/01/2006, 10h59
  5. [VB.NET] Fichier text et byte()
    Par nmerydem dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/11/2004, 17h28

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