2016-10-18 7 views
0

私は現在、バケット内のS3フォルダ(接頭辞)を開き、そのフォルダの内容(XMLポインタのファイル名)を表示するboto3を使用してPythonスクリプトを作成しています。私が持っているコードは次のとおりです。list_objects_v2()はときどき最初のキー値を正しく返しません

def getXMLFileName(self, bucketName, prefix): 
    session = boto3.Session(profile_name=self.profileName) 
    s3client = session.client('s3') 

try: 
    for item in s3client.list_objects_v2(Bucket = bucketName, Prefix = prefix, MaxKeys = 5)['Contents']: 
     print item['Key'] 

次のコードは動作します。しかし、私が入力した接頭辞に応じて、いくつかのが正しいである、私は上記の持っているものに印刷されますが、他の回は、それが唯一の最初の項目にプレフィックス名を印刷します

PrefixName/This.Is.The.XML.Filename1.xml 
PrefixName/This.Is.The.XML.Filename2.xml 
PrefixName/This.Is.The.XML.Filename3.xml 
PrefixName/This.Is.The.XML.Filename4.xml 
PrefixName/This.Is.The.XML.Filename5.xml 

:それは次のように何かを印刷します(PrefixName /)を入力し、残りのファイルを正しく出力します。この場合、次のように表示されます。

PrefixName/ 
PrefixName/This.Is.The.XML.Filename1.xml 
PrefixName/This.Is.The.XML.Filename2.xml 
PrefixName/This.Is.The.XML.Filename3.xml 
PrefixName/This.Is.The.XML.Filename4.xml 

なぜそれがそれをしているのかわかりません。私は少なくとも2日間、特定のバケットフォルダに「ヌル」ファイル名が返されている理由を理解しようとしましたが、それ以外は動作します。関連性があるかどうかはわかりませんが、同じ作業を行う接頭辞はすべて同じ日にS3にアップロードされ、動作しない接頭辞はすべて別の日にアップロードされました。バケット権限の問題なのでしょうか?

if item['Size'] == 0: 
    pass 
else: 
    print item['Key'] 

はしかし、私はちょうどそれのように出力である理由を知りたい:私はforループにif文を追加することによって、この問題を回避する方法を考え出した...本当に

わからないんだけどそれ。

ありがとうございます!

答えて

1

ディレクトリはS3では実際にはありませんが、S3データセットを作成すると、多くのツールが通常のファイルシステム上のディレクトリに大まかにマッピングするメタデータ構造を作成します。

botoを使用してクエリを実行すると、アップロードに使用したツールによって作成されたメタデータ構造が表示されます。

+0

...「フォルダ」を作成する場合は、S3コンソールを含めます。 [* "Amazon S3コンソールは、スラッシュ「/」を含むすべてのオブジェクトを、キー名の最後の(末尾の)文字としてフォルダとして扱います(例:' examplekeyname/')。*](http:// docs .aws.amazon.com/AmazonS3/latest/UG/FolderOperations.html)解決策は、存在する場合、これをスキップすることです。 –

+0

非常に有益で有益です。あなたがた両方に感謝します! – Amanda

関連する問題