2017-11-15 9 views
0

次のコードは、内部にファイルがないサブフォルダがある場合を除いてうまく動作し、サブフォルダはS3に表示されません。例えば /home/temp /サブフォルダにファイルがない場合、サブフォルダはS3に表示されません。 S3で空のフォルダもアップロードされるようにコードを変更する方法は? 私はsthを書こうとしました。 (下記を参照)、空のサブフォルダにput_object()を呼び出す方法はわかりません。pythonを使用してS3に空のサブフォルダをアップロードするには

#!/usr/bin/env python 
import os 
from boto3.session import Session 

path = "/home/temp" 
session = Session(aws_access_key_id='XXX', aws_secret_access_key='XXX') 
s3 = session.resource('s3') 

for subdir, dirs, files in os.walk(path): 
    # note: if not files ...... 
    for file in files: 
     full_path = os.path.join(subdir, file) 
     with open(full_path, 'rb') as data: 

s3.Bucket('my_bucket').put_object(Key=full_path[len(path)+1:],  
Body=data) 

さらに、この関数を呼び出して、サブフォルダやファイルが存在するかどうかをチェックしようとしました。それはファイルには機能しますが、サブフォルダには機能しません。サブフォルダが存在するかどうかをチェックする方法は? (サブフォルダが存在する場合、私はアップロードしないであろう)

def check_exist(s3, bucket, key): 
    try: 
     s3.Object(bucket, key).load() 
    except botocore.exceptions.ClientError as e: 
     return False 
    return True 

ところで、私は

check if a key exists in a bucket in s3 using boto3

http://www.developerfiles.com/upload-files-to-s3-with-python-keeping-the-original-folder-structure/

から上記のコードを参照して共有するためのおかげで、それらはコード。

+0

この質問はAWS S3基本何倍に関連している:S3は、オブジェクトストアで、すべてのオブジェクト名は、実際にキーの名前である、それはフォルダをサポートしていません。 AWSコンソールを使用して表示される内容は、任意です。そのため、S3が「PREFIX」と呼ばれるものを使用して、同様の接頭辞を共有するオブジェクト名を除外する理由があります。これは、ユーザーがフォルダのように体系的にオブジェクトを整理してフィルタリングできるようにする唯一の方法です。 – mootmoot

答えて

7

ディレクトリ(フォルダ、サブフォルダなど)がS3に存在しません。

このファイルを空のS3バケット/mydir/myfile.txtにコピーすると、ファイルmyfile.txtのみがS3にコピーされます。ディレクトリmydirは、その文字列がファイル名mydir/myfile.txtの一部であるため作成されません。実際のファイル名はフルパスで、サブディレクトリが存在しないか作成されていません。

S3は、バケット内のファイルをリストするときに接頭辞を使用してディレクトリをシミュレートします。 mydir/を指定すると、mydir/で始まるすべてのS3オブジェクトが返されます(mydir/anotherfolder/myotherfile.txtなど)。 S3は、サブディレクトリの外観を作成できるように、/などの区切り文字をサポートしています。

注:S3オブジェクトのファイル名の冒頭には/はありません。

​​

+0

Johnに感謝します。したがって、空のサブフォルダをアップロードする方法はありませんか?私はちょうどバックアップ目的のためにS3にその構造を含むディレクトリ全体をアップロードしたいと思う。それは奇妙なS3は、バックアップ機構のような種類がありません。私はディレクトリ全体をローカルで圧縮してからS3に単一の圧縮ファイルをアップロードする必要があるようです。 – user389955

+0

ディレクトリにはディレクトリが存在しないため、空のディレクトリはアップロードできません。注:一部のソフトウェア製品は、S3(CloudBerry)でシミュレートされたディレクトリエントリを作成します。これらは実際には長さ0のファイルです。 S3をローカルファイルシステムのバックアップクローンとして使用する場合は、S3がファイルシステムではなくキーバリューストアであるため、問題が発生します。 zipファイルを作成し、zipファイルをアップロードすることは実用的な方法です。 –

+2

@ user389955 S3は階層構造ではありません。ファイルは「イン」フォルダではありません。これは、S3が本質的に無限の数のオブジェクトにスケールアップし、パフォーマンスに変化がない理由の一部です。あなたは本当にS3でフォルダを "見つける"ことができれば、名前が '/'で終わる空のオブジェクトをアップロードすることができますが、それはまさに錯覚であり、何かがあるかどうかについては何も教えてくれませんAPIを介してそれを削除しても、そのファイル内のファイルは削除されません)。 –

関連する問題