2017-12-07 7 views
0

S3のフラットな構造について誰かに教えてもらう前に、私はすでに知っていますが、S3で'フォルダ 'を作成することができます。このPythonコードの私の目的は、実行の日付を使用して名前を付けた名前の新しいフォルダを作成し、これにユーザーの入力を追加することです(createS3Folder関数です)。次に、ローカルディレクトリのフォルダをこのフォルダに同期します。新しいS3 'フォルダ'の下にBoto3フォルダの同期 '

問題は、私のupload_files関数が、ローカルセットアップのフォルダ構造を正確にエミュレートする新しいフォルダをS3に作成することです。

誰も名前を変更せずに新しく作成したフォルダにフォルダを同期する方法を提案できますか?

import sys 
import boto3 
import datetime 
import os 

teamName = raw_input("Please enter the name of your project: ") 
bucketFolderName = "" 

def createS3Folder(): 
    date = datetime.date.today().strftime("%Y") + "." + 
    datetime.date.today().strftime("%B") + "." + 
    datetime.date.today().strftime("%d") 
    date1 = datetime.date.today() 
    date = str(date1) + "/" #In order to generate a file, you must 
    put "/" at the end of key 
    bucketFolderName = date + teamName + "/" 
    client = boto3.client('s3') 
    client.put_object(Bucket='MY_BUCKET',Key=bucketFolderName) 
    upload_files('/Users/local/directory/to/sync') 

def upload_files(path): 
    session = boto3.Session() 
    s3 = session.resource('s3') 
    bucket = s3.Bucket('MY_BUCKET') 
    for subdir, dirs, files in os.walk(path): 
     for file in files: 
      full_path = os.path.join(subdir, file) 
      with open(full_path, 'rb') as data: 
       bucket.put_object(Key=bucketFolderName, Body=data) 

def main(): 
    createS3Folder() 

if __name__ == "__main__": 
    main() 

答えて

1

あなたupload_files()機能がにアップロードされます。それは次のようになります。

bucket.put_object(Key=bucketFolderName + '/' + file, Body=data) 

キーはファイル名(だけでなく、「ディレクトリ」)を含む宛先オブジェクトのフルパス、です。

実際には、「フォルダ」を事前に作成する必要はありません。目的のKeyにアップロードするだけです。

あなたが怠け者になっている場合は、AWS Command-Line Interface (CLI)aws s3 syncコマンドを使用してください。

1

あなたは、

ありませんすることはできません "という事実は、あなたがS3で 'フォルダ' を作成することができています"。

コンソール内のフォルダのように見える空のオブジェクトを作成することはできますが、まだフォルダではなく、それでも意味はなく、まだ不要です。また、APIを使用して削除すると、フォルダ内がまだ "バケツ"にあると思った。コンソールから削除すると、そのキープレフィックスで始まるすべてのオブジェクトが明示的に削除されるため、すべてのコンテンツがバケットから削除されます)。これは、S3にはコンテナであるフォルダがないためです。

ファイルcat.pngを保存してhat/フォルダのように見せたい場合は、オブジェクトキーをhat/cat.pngに設定するだけです。 hat/フォルダーが明示的に作成されたかどうかにかかわらず、これはコンソールで観察されたのとまったく同じ効果があります。

共通の接頭辞( "フォルダ名")と/の区切り文字を含む文字列操作で、オブジェクトごとに目的のオブジェクトキーを作成するだけです。区切り文字が意味する任意のフォルダ構造は、結果としてコンソールに表示されます。これは、S3上のファイル名(「キー」)は、「フォルダ」の名前になることを意味し

bucket.put_object(Key=bucketFolderName, Body=data) 

+0

私はAWSに十分熟練しており、S3バケットのアイデアを十分に理解しています。私はこれらがオブジェクトであることは承知していますが(CLIに慣れていれば、Boto3はこれをAWSの初心者でさえも豊富にするでしょう)、概念的にはフォルダとして機能します。したがって、 "区切り文字"という言葉があります。プレーンテキストまたは他のデータストリーム内の独立した独立した領域間の境界を指定するために使用されます。区切り文字の例はカンマ区切りの値のシーケンスでフィールド区切り文字として機能するカンマ文字です。 – BitLord

+0

このコンセプトは人々を理解するのが難しいことを除いて。フォルダはファイルシステムに存在するのと同じ方法でS3に存在しません。これを行う:1)TEST/2という名前のフォルダを作成する)このパスのファイルをアップロードするTEST/TESTFILE.TXT 3)オブジェクトTESTの名前をOTHER /に変更する。 TESTFILE.TXTというファイルが "OTHER /"にある2つのフォルダ "TEST /"と "OTHER /"があることに注目してください。ほとんどの人は、ディレクトリの名前を変更すると、inの子ファイルも取得すると予想します。 –

関連する問題