当我可以手动找到代码时,为什么代码无法找到AWS S3路径中指定的文件?

时间:2018-06-08 10:01:29

标签: python amazon-web-services amazon-s3 amazon-sagemaker

我有一个名为my_bucket的存储桶,其中有一个名为Images的文件夹。我正在尝试读取Image文件夹中的文件(图像)。

file = pd.read_csv(some_csv_file)
X = file.values[:,0]

role = get_execution_role()
bucket='my_bucket'
data_key = 'Images'
data_dir = 's3://{}/{}'.format(bucket, data_key)
s = '/'

for img_name in X:
    seq = (data_dir, img_name)
    img_path = s.join(seq)
    img = imread(img_path)

但它会出现以下错误:

---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
<ipython-input-20-a273242ed30e> in <module>()
     43     img_path = s.join(seq)
     44     print(img_path)
---> 45     img = imread(img_path)
     46     img = imresize(img, (32, 32))
     47     img = img.astype('float32') # this will help us in later stage

~/anaconda3/envs/python3/lib/python3.6/site-packages/numpy/lib/utils.py in newfunc(*args, **kwds)
     99             """`arrayrange` is deprecated, use `arange` instead!"""
    100             warnings.warn(depdoc, DeprecationWarning, stacklevel=2)
--> 101             return func(*args, **kwds)
    102 
    103         newfunc = _set_function_name(newfunc, old_name)

~/anaconda3/envs/python3/lib/python3.6/site-packages/scipy/misc/pilutil.py in imread(name, flatten, mode)
    162     """
    163 
--> 164     im = Image.open(name)
    165     return fromimage(im, flatten=flatten, mode=mode)
    166 

~/anaconda3/envs/python3/lib/python3.6/site-packages/PIL/Image.py in open(fp, mode)
   2541 
   2542     if filename:
-> 2543         fp = builtins.open(filename, "rb")
   2544         exclusive_fp = True
   2545 

FileNotFoundError: [Errno 2] No such file or directory: 's3://my_bucket/Images/377.jpg'

377.jpgX中的第一行。我在S3存储中手动检查;这个文件出现在那里。那么,为什么我会收到此错误,以及如何修复它?我能想到的唯一原因是,可能指定S3路径的过程是错误的 - 但在S3文档中,指定存储的过程以's3://{}/{}'.format(bucket, data_key)给出。此外,在错误消息的最后一行,文件名为s3://my_bucket/Images/377.jpg,这是我手动导航以查找存储桶中文件的路径。

2 个答案:

答案 0 :(得分:0)

如果实现是在python中,请使用boto3。

例如,

import boto3 
s3 = s3_session.client('s3')
object = s3.get_object(Bucket=bucket_names,Key=object_name)
objectContent = object['Body'].read()

参考:https://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.get_object

答案 1 :(得分:0)

检查附加到sagemaker笔记本实例的IAM角色,您必须有权访问s3。确保您已对s3存储桶和存储桶/ *中的所有对象具有读取权限。您不必使用boto3。