【问题标题】:Download and Read HDF5 file from Amazon S3 and Boto3从 Amazon S3 和 Boto3 下载和读取 HDF5 文件
【发布时间】:2019-10-03 02:21:16
【问题描述】:

我在这里很新。我会尽量说清楚。

我用 pytables 创建了一个 hdf5 文件,并用数据填充了它。 然后,我使用以下代码将文件从我的 aws 集群的 /tmp/ 目录上传到 S3 存储桶:

  • s3_client.upload_file(local_file_key, aws_bucket_name, aws_file_key)

我已经从 S3 下载了相同的 hdf5 文件,并使用以下代码将其再次存储在我的 aws 集群的 /tmp/ 目录中:

  • s3_client.download_file(aws_bucket_name, aws_file_key, another_local_file_key)

直到那里,没有问题。当我想读取上传的文件时出现问题。

  • 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'

然后,我在集群的shell中做了一些验证。

[user@cluster_ip_address tmp$] file my_dataset.hdf5

返回

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

但是[user@cluster_ip_address tmp$] file from_aws_dataset.hdf5返回

 from_aws_dataset.hdf5: data

在我的python代码中,

tables.is_pytables_file('/tmp/from_aws_dataset.hdf5') 返回None

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

有人可以帮帮我吗?

【问题讨论】:

  • 我遇到了类似的问题,但我使用的是h5py。就我而言,我的错误是我在写入数据后忘记关闭文件。

标签: python amazon-s3 hdf5 boto3 pytables


【解决方案1】:

我的第一个猜测是文件是以文本模式传输的。 HDF5 文件签名旨在检测这种修改。

您是否尝试过使用boto3 的uploadfileobj() 方法而不是upload_file()?看起来前者适用于像 HDF5 这样的二进制文件。从 boto 文档中不清楚后者是否暗示文本。

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

看起来您也可以使用 put() 方法显式指定二进制传输,如下所示:

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

HDF5 文件签名记录在 here,如果您有兴趣。只需向下滚动一点到超级块的第一个字段,其中显示“格式签名”。

【讨论】:

  • 你好。谢谢回答。这个我试过了,还是不行。
【解决方案2】:

旧帖子,但本着试图解决问题的精神......

您能否尝试通过 AWS S3 控制台手动下载文件,然后直接在 Python 中读取。如果失败了,那么我猜你上传的文件不正确。如果可行,您可以尝试使用以下命令下载文件吗:

conn = boto.connect_s3('<<YOUR KEY ID>>','<<YOUR SECRET ACCESS KEY>>') #Make Connection
bucket = conn.get_bucket(THE_NAME_OF_YOUR_BUCKET) # Get bucket object
k = Key(bucket,FILE_AND_PATH) #Get Key object of file
k.get_contents_to_filename(LOCAL_PATH_TO_SAVE) #Saves the file to local. Should save and preserve everything

看看这个,很有用: https://techietweak.wordpress.com/2016/05/16/file-handling-in-aws-s3-with-python-boto-library/

【讨论】:

    【解决方案3】:

    对我来说这很有效:

    import boto3
    s3 = boto3.resource('s3', region_name)
    bucket = s3.Bucket(bucket_name)
    with open(hdf5_file, 'rb') as f:
        bucket.Object(key).put(Body=f)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-16
      • 2021-05-22
      • 2011-11-10
      • 2014-12-01
      • 1970-01-01
      • 2020-05-29
      • 2014-11-28
      • 1970-01-01
      相关资源
      最近更新 更多