Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从AmazonS3和Boto3下载并读取HDF5文件_Python_Amazon S3_Hdf5_Boto3_Pytables - Fatal编程技术网

Python 从AmazonS3和Boto3下载并读取HDF5文件

Python 从AmazonS3和Boto3下载并读取HDF5文件,python,amazon-s3,hdf5,boto3,pytables,Python,Amazon S3,Hdf5,Boto3,Pytables,我是新来的。我会尽量澄清的 我用pytables创建了一个hdf5文件,并用数据填充了它。 然后,我使用以下代码将我的文件从aws集群的/tmp/目录上载到S3存储桶: s3\u客户端。上传\u文件(本地\u文件\u密钥、aws\u bucket\u名称、aws\u文件\u密钥) 我已从S3下载了相同的hdf5文件,并使用以下代码将其再次存储在aws群集的/tmp/目录中: s3\u客户端。下载\u文件(aws\u bucket\u名称、aws\u文件\u密钥、另一个\u本地\u文件\u密

我是新来的。我会尽量澄清的

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

  • s3\u客户端。上传\u文件(本地\u文件\u密钥、aws\u bucket\u名称、aws\u文件\u密钥)
我已从S3下载了相同的hdf5文件,并使用以下代码将其再次存储在aws群集的/tmp/目录中:

  • s3\u客户端。下载\u文件(aws\u bucket\u名称、aws\u文件\u密钥、另一个\u本地\u文件\u密钥)
在那之前,没有问题。当我想读取上传的文件时,问题出现了

  • 表格。打开文件(另一个本地文件密钥)

然后,我在集群的外壳中进行了一些验证

[user@cluster_ip_address tmp$] file my_dataset.hdf5
返回

 my_dataset.hdf5: Hierarchical Data Format (version 5) data
 from_aws_dataset.hdf5: data
但是
[user@cluster_ip_address_aws_dataset.hdf5中的tmp$]文件返回

 from_aws_dataset.hdf5: data
在我的python代码中

tables.is_pytables_文件('/tmp/from_aws\u dataset.hdf5')
返回
None

boto3 version: '1.4.7', python version: 2.7, tables version: '3.4.2', h5py version: '2.7.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文件签名。只需向下滚动到superblock的第一个字段,其中显示“格式签名”。

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

您是否可以尝试通过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
conn=boto.connect_s3('','')#建立连接
bucket=conn.get_bucket(您的_bucket的_名称)#get bucket对象
k=密钥(bucket、FILE_和_PATH)#获取文件的密钥对象
k、 获取内容到文件名(本地路径到保存)#将文件保存到本地。我们应该保存和保存一切
看看这个,它非常有用:

对我来说,这很有效:

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)

你好谢谢你的回答。我已经试过了,但仍然不起作用。我有一个类似的问题,但我使用的是
h5py
。在我的例子中,我的错误是在向文件写入数据后忘记关闭该文件。