我想將檔案從子檔案夾復制到同一個 s3 存盤桶中的另一個子檔案夾中。我在 SO 中閱讀了很多問題,最后我得到了這段代碼。它有一個問題,當我運行它時,它可以作業,但它不會僅復制檔案,而是將包含檔案的檔案夾復制到我想要的目標位置,但我已經擁有該檔案,但在檔案夾(根)內。如何只復制該子檔案夾中的檔案?
XXXBUCKETNAME:
-- XXXX-input/ # I want to copy from here
-- XXXX-archive/ # to here
import boto3
from botocore.config import Config
s3 = boto3.resource('s3', config=Config(proxies={'https': getProperty('Proxy', 'Proxy.Host')}))
bucket_obj = s3.Bucket('XXX')
destbucket = 'XXX'
jsonfiles = []
for obj in bucket_obj.objects.filter(Delimiter='/', Prefix='XXXX-input/', ):
if obj.key.endswith('json'):
jsonfiles.append(obj.key)
for k in jsonfiles:
if k.split("_")[-1:][0] == "xxx.txt":
dest = s3.Bucket(destbucket)
source= { 'Bucket' : destbucket, 'Key': k}
dest.copy(source, "XXXX-archive/" k)
它給出:
XXXBUCKETNAME:
-- XXXX-input/
-- XXXX-archive/
-- XXXX-input/file.txt
我想:
XXXBUCKETNAME:
-- XXXX-input/
-- XXXX-archive/
-- file.txt
uj5u.com熱心網友回復:
在 S3 中真的沒有任何“檔案夾”。有桶和物件,如檔案中所述。UI 可能看起來像是有檔案夾,但物件的關鍵是整個路徑。因此,如果您想復制一個專案,您將需要決議它的鍵并以不同的方式構建目標鍵,以便它具有相同的前綴(路徑)但以不同的值結尾。
在 Amazon S3 中,存盤桶和物件是主要資源,物件存盤在存盤桶中。Amazon S3 具有扁平結構,而不是您在檔案系統中看到的層次結構。但是,為了組織簡單起見,Amazon S3 控制臺支持將檔案夾概念作為對物件進行分組的一種方式。它通過為物件使用共享名稱前綴(即,物件具有以公共字串開頭的名稱)來實作這一點。物件名稱也稱為鍵名稱。
在您的代碼中,您正在拉出每個物件的鍵,這意味著即使沒有真正的路徑,鍵也已經包含完整的“路徑”。因此,您需要拆分/字符上的鍵,然后獲取結果串列中的最后一個元素并將其附加為檔案名:
dest.copy(source, "XXXX-archive/" k.split("/")[-1])
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/386944.html
上一篇:另一個sftp到s3檔案上傳問題
