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 :

tableau 2D, fichier binaire (debutant)


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Collégien
    Inscrit en
    Mars 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Mars 2003
    Messages : 192
    Par défaut tableau 2D, fichier binaire (debutant)
    Salut à tous,

    Je programme depuis longtemps en C et je débute actuellement en python. Je suis un peu surpris de sécher aussi rapidement... désolé si la question semble basique, mais je n'ai pas trouvé de solution claire à mon problème.

    J'ai un fichier binaire dans lequel il y a un "tableau" 2D de nombres (float) d'une taille (nx+1) et (ny+1) dans l'une et l'autre dimension, respectivement. le fichier est écrit par un programme C.

    Mes problèmes :

    - je n'ai pas compris comment créer un tableau 2D "vide" en python. Je pense savoir créer un tableau 2D genre [[2,3,5],[4,2,1]] mais pour un tableau 1024*1024 élements, je ne vois pas comment le créer.


    - J'ai compris que fichier.read() allait me retourner une chaine de caractère à partir de mon fichier binaire. Je suis pas sûr de savoir comment transférer mes données dans un tableau 2D ?

    Est-ce que tout ça est possible "simplement" en python de base, où est-ce qu'il faut que j'aille vers quelque chose de pus haut niveau genre "numpy" ?


    voici un code C produisant un fichier binaire que j'aimerai relire en python :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
     
    int main(void)
    {
     
    float *array;
    int nx, ny;
    int i, j, ij;
    FILE *fp;
     
    nx = 1024;
    ny = 512;
    fp = fopen("array.dat","w");
     
    array = calloc((nx+1)*(ny+1), sizeof(*array));
     
    for (i=0; i<nx+1; i++)
        {
        for (j=0; j<ny+1; j++)
            {
            ij = i + j*(nx+1);
            array[ij] = ij;
            }
        }
     
     
    fwrite (array,sizeof(*array),(nx+1)*(ny+1),fp);
     
     
    fclose(fp);
    free(array);
    return 0;
    }



    Merci beaucoup si qqn peut m'aiguiller vers des exemples/solutions

  2. #2
    Membre confirmé
    Homme Profil pro
    Collégien
    Inscrit en
    Mars 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Mars 2003
    Messages : 192
    Par défaut
    Re salut,

    Après quelques tentatives infructueuses, voici le petit code vers lequel j'ai convergé. Quelqu'un peut-il me dire si c'est effectivement une bonne façon de faire, où s'il y a mieux et pourquoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    import numpy as np
     
    fichier = open('array.dat', 'rb') # ouverture du fichier binaire
     
    # changer la taille de nx et ny dans le code C
    # petit tableau plus facile a afficher
     
    nx = 4
    ny = 3
     
    b = np.fromfile(fichier, "float32", (nx+1)*(ny+1))
    print b
    print b.dtype
    b=b.reshape((nx+1, ny+1))
    print b
    fichier.close()

  3. #3
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut
    Je ne peut pas beaucoup t'aider ne connaissant pas le C.
    Mais je peut t'expliquer:
    Pour lire les fichiers en python:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    fichier=open('array.dat', 'rb')
    fichier.read()#retourne l'ensemble du fichier sous forme d'un string
    fichier.seek(0)#permet de revenir au début ou se positionner fichier.seek(2) a la fin ou fichier.seek(1) a la position actuelle
    fichier.readlines() #retourne toutes les lignes du fichier (a condition d'etre au début du fichier) dans un tableau avec une ligne par case de tableau.
    fichier.seek(0) #repositionnement
    fichier.readline() #retourne la ligne actuelle.
    fichier.tell() #indique la position
    fichier.close() #les bonnes habitudes
    Pour l'insertion dans un tableau je pense qu'on peut boucler sur les données extraites par les techniques mentionner précédement, sinon je connait pas numpy, en tous cas en python:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    fichier=file('array.dat', 'rb') #equivalent a open()
    tech_1=fichier.read()
    fichier.seek(0)
    tech_2=fichier.readlines()
    fichier.close()
    a=[]
    b=[]
    tableau=[a,b]
    i=0
    while i < len (tech_1) :
      tableau[0].append(tech_1[i]) #pour ajouter a la fin de a
      tableau[1].append(tech_1[i]) #pour ajouter a la fin de b
      i += 1 #je crois que c'est ++ en C
     
    #dans le cas d'un tableau 2D j'utiliserai une double boucle,
     
    i=0
    while i < len(tech_2) : #i=index c'est pratique car len() ne part pas de 0.
      for values in tech_2[i] :  
        tableau[0].append(values)
        tableau[1].append(values)
      i += 1
     
    #personnellement je préfère la syntaxe suivante produisant == résultat:
    i=0
    while i < len(tech_2) : #i=index c'est pratique car len() ne part pas de 0.
      i_2=0
      while i_2 < len(tech_2[i]) :  
        tableau[0].append(tech_2[i][i_2]) #sa permet d'accéder aux sous indices
        tableau[1].append(tech_2[i][i_2]) #sa permet d'accéder aux sous indices
        i_2 += 1 
     
      i += 1
    Il faudrait peut etre inclure des structures conditionnelles dans les boucles pour différencier les x et y.

    Conseil: Si tu vient du C choisis un interpréteur qui affiche les docstrings entièrement et la liste des arguments a fournir, tu verra c'est très pratique.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 729
    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 729
    Par défaut
    Salut,

    Est-ce que tout ça est possible "simplement" en python de base, où est-ce qu'il faut que j'aille vers quelque chose de pus haut niveau genre "numpy" ?
    Python vient avec les modules array et struct qui vous permettent de dire "lire le fichier de floats dans une array" - array = tableau 1D.
    Voir les exemples de D.Hellmann sur le sujet.

    Là ou çà coince un peu (et ou Numpy devient "utile"), c'est pour la prise en compte des N dimensions du tableau.
    Note: C'est pas si compliqué d'encapsuler l'array dans une chose qui permette de gérer les dimensions, mais c'est de base dans numpy.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre confirmé
    Homme Profil pro
    Collégien
    Inscrit en
    Mars 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Mars 2003
    Messages : 192
    Par défaut
    Merci pour vos réponses :-)

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/04/2007, 11h38
  2. [debutant] Lire un fichier binaire.
    Par parp1 dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 02/04/2007, 10h56
  3. Récupérer un tableau d'un fichier binaire
    Par norwy dans le forum C++
    Réponses: 2
    Dernier message: 06/09/2006, 12h16
  4. Réponses: 27
    Dernier message: 16/10/2005, 22h01
  5. [Debutant] Comment lire la taille d'un fichier binaire ?
    Par Invité dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 18/12/2003, 19h20

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