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

时间:2018-03-28 00:30:53

标签: python boto3

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

2018 \ 1个\ 2 \ 1.XML 2018 \ 1 \ 3 \ 1.XML 2018 \ 1 \ 3 \ 2.XML

等。因此,一天可以使用多个.xml文件。另外,需要注意的是,这个存储桶中有些文件夹我不想拉。所以我必须定位一个非常具体的目录。

文件中没有日期时间戳,所以我需要使用创建,修改过的东西。为此,我想到使用键的字典,将文件夹+ xml文件作为键,创建/修改时间戳作为值。然后,使用该dict基本上重新拉动所有对象。

这是我尝试过的......

mport boto3
from pprint import pprint

client = boto3.client('s3')
paginator = client.get_paginator('list_objects_v2')
result = paginator.paginate(
    Bucket='bucket',
    Prefix='folder/folder1/folder2')

bucket_object_list = []
for page in result:
    pprint(page)
    if "Contents" in page:
        for key in page[ "Contents" ]:
            keyString = key[ "Key" ]
            pprint(keyString)
            bucket_object_list.append(keyString)

s3 = boto3.resource('s3')
obj = s3.Object('bucket','bucket_object_list')
obj.get()["Contents"].read().decode('utf-8')

pprint(obj.get())
sys.exit()

这是在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.

1 个答案:

答案 0 :(得分:1)

NameError: name 'key' is not defined

就错误而言,这是因为没有定义密钥。

来自this文档:

  

对象(bucket_name,key)

     

创建一个Object资源。:

     

object = s3.Object('bucket_name','key')

     

<强>参数

     

bucket_name(string) - Object的bucket_name标识符。这必须设置。

     

key(string) - 对象的密钥标识符。这必须设置。

您需要为代码中使用的“密钥”指定对象密钥名称

keyName是“名称”(=唯一标识符),您的文件将通过该名称存储在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'))