2017-10-11 14 views
0

Je suis assez nouveau ici. Je vais essayer d'être clair.Télécharger et lire le fichier HDF5 à partir d'Amazon S3 et Boto3

J'ai créé un fichier hdf5 avec pytables et je l'ai rempli avec des données. Puis, je l'ai téléchargé mon fichier à partir du répertoire/tmp/de mon groupe SSFE à un seau S3 en utilisant ce code:

  • s3_client.upload_file(local_file_key, aws_bucket_name, aws_file_key)

J'ai téléchargé le même fichier hdf5 de S3 et un magasin nouveau dans le répertoire/tmp/de mon groupe SSFE en utilisant ce code:

  • s3_client.download_file(aws_bucket_name, aws_file_key, another_local_file_key)

Jusqu'à là, il n'y a pas de problème. Le problème apparaît lorsque je veux lire le fichier téléchargé.

  • tables.open_file(another_local_file_key)

File "H5F.c", line 604, in H5Fopen 
     unable to open file 
     File "H5Fint.c", line 1087, in H5F_open 
     unable to read superblock 
     File "H5Fsuper.c", line 277, in H5F_super_read 
     file signature not found 

    End of HDF5 error back trace 

    Unable to open/create file '/tmp/from_aws_dataset.hdf5' 

Puis, je l'ai fait quelques vérifications dans la coquille de mon groupe.

[[email protected]_ip_address tmp$] file my_dataset.hdf5 

retours

my_dataset.hdf5: Hierarchical Data Format (version 5) data 

Mais [[email protected]_ip_address tmp$] file from_aws_dataset.hdf5 retourne

from_aws_dataset.hdf5: data 

Et dans mon code python,

tables.is_pytables_file('/tmp/from_aws_dataset.hdf5') retours None

boto3 version: '1.4.7', python version: 2.7, tables version: '3.4.2', h5py version: '2.7.1' 

Quelqu'un pourrait-il m'aider?

Répondre

0

Ma première supposition serait que le fichier a été transféré en mode texte. La signature du fichier HDF5 a été conçue pour détecter ce genre de fusion.

Avez-vous essayé d'utiliser la méthode uploadfileobj() de boto3 au lieu de upload_file()? On dirait que le premier est pour les fichiers binaires comme HDF5. Les documents boto ne sont pas clairs si ce dernier implique un texte.

with open("myfile.h5", "rb") as f: 
    s3.upload_fileobj(f, "bucket-name", "key-name") 

Il semble aussi que vous pouvez spécifier les transferts binaires en utilisant explicitement la méthode put(), comme suit:

s3.Object('mybucket', 'myfile.h5').put(Body=open('/tmp/myfile.h5', 'rb')) 

La signature du fichier HDF5 est documenté here, si vous êtes intéressé. Déplacez-vous un peu vers le premier champ du superbloc où est indiqué «Signature du format».

+0

Bonjour. Merci de répondre. J'ai essayé mais ça ne marche pas. – newIn