Forum Programmation.python librairie pyfits: problème avec del_col

Posté par  .
Étiquettes : aucune
0
13
fév.
2007
Bonjour,

Je suis en train de manipuler une table fits à l'aide de la librairie pyfits. Mon problème est que je dois créer une nouvelle table à partir de cette table. Ma nouvelle table comporte des nouvelles colonnes et d'autres doivent disparaitre. Je commence donc par récupérer le définition des colonnes de l'ancienne table:



listcolumns = oldtable[1].get_coldefs()


Ensuite, j'ajoute mes nouvelles colonnes:

col1 = pyfits.Column(name='newCol',format='E',array=numarray.array(data))

listcolumns = listcolumns.add_col(col1)


Jusque là aucun problème mais quand je veux effacer une colonne avec del_col, j'obtiens un message d'erreur. Par exemple:

listcolumns = listcolumns.del_col("toto")


me donne:

Traceback (most recent call last):

File "", line 1, in
File "/dsm/sappccosmos0/clibbrec/local/Soft/Python-2.5/lib/python2.5/site-packages/pyfits.py", line 2919, in del_col
self._nfields -= 1
File "/dsm/sappccosmos0/clibbrec/local/Soft/Python-2.5/lib/python2.5/site-packages/pyfits.py", line 2835, in __getattr__
raise KeyError, 'Attribute %s not defined.' % name
KeyError: 'Attribute _nfields not defined.'


J'ai essayé d'autres choses mais manifestement, il y a quelque chose que je ne comprend pas avec l'usage de del_col.

Si quelqu'un pouvait me filer une info ou un coup de main, je lui en serais reconnaissant.
  • # trouvé ça

    Posté par  (site web personnel) . Évalué à 1.

    sur
    http://stsdas.stsci.edu/pyfits/current/source/pyfits.py

    extrait

    def del_col(self, col_name):
    """Delete (the definition of) one Column."""
    indx = rec.index_of(self.names, col_name)

    for cname in commonNames:
    attr = getattr(self, cname+'s')
    del attr[indx]

    del self._arrays[indx]
    self._nfields -= 1

    C'est comparable ta manière de détruire ?

    ウィズコロナ

    • [^] # Re: trouvé ça

      Posté par  . Évalué à 1.

      Suite à ta proposition, j'ai ouvert le fichier pyfits.py pour comprendre ce qui se passe. Voici le code du del_col qui est ce que tu as renseigné dans ton message:
      2910     def del_col(self, col_name):
      2911         """Delete (the definition of) one Column."""
      2912         indx = _get_index(self.names, col_name)
      2913
      2914         for cname in _commonNames:
      2915             attr = getattr(self, cname+'s')
      2916             del attr[indx]
      2917
      2918         del self._arrays[indx]
      2919         self._nfields -= 1
      
      A part le fait que l'instruction qui devrait marché,puisque la procedure ne retourne rien, est
      listcolumns.del_col("toto")
      Mais j'obtiens toujours le meme message d'erreur. Il a l'air ne pas aimer le _nfields et j'ignore pourquoi.
      • [^] # Un piste ???

        Posté par  . Évalué à 1.

        Dans la meme optique, j'ai appliqué la méthode 'bourrin'... j'ai commenté la ligne contenant self.nfields -= 1 dans le fichier pyfits.py et là, tout marche à merveille. La colonne est bien effacée... maintenant, j'ignore s'il y a des conséquences facheuses et subtiles.

        J'arrive à la conclusion, soit il y a un problème avec le del_col ou soit il y a une subtilité dans son usage. Mais manifestement sur tout le web, je suis le seul à vouloir effacer des colonnes d'une table fits puisque je n'ai trouvé aucun exemple où quelqu'un utilise le del_col ...
        • [^] # Re: Un piste ???

          Posté par  . Évalué à 1.

          Hummm...
          D'apres le constructeur de ColDefs, le seul cas ou self._nfields n'est pas directement cree est lorsque l'objet en entree est du type BinTableHDU .
          Dans ce cas la, toutes les donnees membres de input.columns sont copiees dans self.

          Je dirais donc que le probleme se situe lors de la creation listcolumns...
          Mais bon, sans le code sous la main, hein...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.