Python 从AmazonS3和Boto3下载并读取HDF5文件
我是新来的。我会尽量澄清的 我用pytables创建了一个hdf5文件,并用数据填充了它。 然后,我使用以下代码将我的文件从aws集群的/tmp/目录上载到S3存储桶: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密
s3\u客户端。上传\u文件(本地\u文件\u密钥、aws\u bucket\u名称、aws\u文件\u密钥)
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
。在我的例子中,我的错误是在向文件写入数据后忘记关闭该文件。