Python 使用Boto3在特定文件夹上创建循环

Python 使用Boto3在特定文件夹上创建循环,python,boto3,Python,Boto3,我正在测试XML中的新数据源。这些数据将以以下格式存储在S3中: 2018\1\2\1.xml 2018\1\3\1.xml 2018\1\3\2.xml 因此,一天内可以有多个.xml文件。另外,需要注意的是,这个bucket中有一些我不想提取的文件夹。所以我必须针对一个非常特定的目录 文件中没有日期时间戳,所以我需要使用创建的、修改过的,可以使用的东西。要做到这一点,我考虑使用一个键字典,使用folder+xml文件作为键的值,使用created/modified timestamp作为值。

我正在测试XML中的新数据源。这些数据将以以下格式存储在S3中:

2018\1\2\1.xml 2018\1\3\1.xml 2018\1\3\2.xml

因此,一天内可以有多个.xml文件。另外,需要注意的是,这个bucket中有一些我不想提取的文件夹。所以我必须针对一个非常特定的目录

文件中没有日期时间戳,所以我需要使用创建的、修改过的,可以使用的东西。要做到这一点,我考虑使用一个键字典,使用folder+xml文件作为键的值,使用created/modified timestamp作为值。然后,使用该命令从本质上重新拖动所有对象

这是我试过的

这是从obj=s3.Object'cluster','key'行中的键引发错误

Traceback (most recent call last):
  File "s3test2.py", line 25, in <module>
    obj = s3.Object('cluster', key)
NameError: name 'key' is not defined
Maxitems仅用于测试目的,尽管它很有趣,因为运行时转换为1000

NameError: name 'key' is not defined
就错误而言,这是因为没有定义键

从文件:

Objectbucket\u名称、密钥

创建对象资源:

object=s3.对象'bucket_name','key'

参数

bucket_namestring—对象的bucket_名称标识符。这必须设置

keystring—对象的密钥标识符。这必须设置

您需要为代码中使用的“键”指定一个对象键名称

keyName是name=唯一标识符,您的文件将通过该标识符存储在S3存储桶中

代码基于您发布的内容:

import boto3

client = boto3.client('s3') 
paginator = client.get_paginator('list_objects_v2') 
result = paginator.paginate( Bucket='bucket_name', Prefix='folder/folder1/folder2') 
bucket_object_list = [] 
for page in result:  
    if "Contents" in page: 
        for key in page[ "Contents" ]: 
            keyString = key[ "Key" ] 
            print(keyString) 
            bucket_object_list.append(keyString) 

print bucket_object_list

s3 = boto3.resource('s3') 
for file_name in bucket_object_list:
    obj = s3.Object('bucket_name',file_name) 
    print(obj.get())
    print(obj.get()["Body"].read().decode('utf-8')) 

首先,s3不是文件系统,文件夹名是任意的,是对象键的一部分。它使用前缀过滤器来选择类似的任意文件夹名称。第二,您可以在s3对象元内存储一些元信息。最后,始终复制异常错误,即使是从您的代码中,当您执行此操作时,可能有人已经知道编码错误。对象'cluster',key,您是否有bucket call cluster?你的密钥来自哪里?我知道它不是一个文件系统,但是AWS文档声明你应该能够使用前缀来访问你想要密钥的文件夹。没有一个bucket被命名为cluster,我只是使用了任意的名称,出于某种原因,我没有使用后面的ABucket名称表单。在代码的第二部分,我的意图是拉出分页器抓取的确切的键。我可能在这里完全偏离了方向,我是SaS。我添加了错误。是的,我只是在循环的顶部设置了一个bucket\u object\u list=[],我想用键填充它。我认为我看到的更大的问题是,当我运行Paginator时,我没有看到任何内容,等等。这几乎就像它没有抓取任何键一样,即使我知道存在对象。我更新了上面的代码,明白了。有一些新的错误,但我认为这更多的是与我的对象中的特殊字符有关,而不是与代码有关是的,这段代码与我没有任何错误的bucket和文件一起工作。请参阅调试您提到的错误
import boto3

client = boto3.client('s3') 
paginator = client.get_paginator('list_objects_v2') 
result = paginator.paginate( Bucket='bucket_name', Prefix='folder/folder1/folder2') 
bucket_object_list = [] 
for page in result:  
    if "Contents" in page: 
        for key in page[ "Contents" ]: 
            keyString = key[ "Key" ] 
            print(keyString) 
            bucket_object_list.append(keyString) 

print bucket_object_list

s3 = boto3.resource('s3') 
for file_name in bucket_object_list:
    obj = s3.Object('bucket_name',file_name) 
    print(obj.get())
    print(obj.get()["Body"].read().decode('utf-8'))