我正在使用python 2.7。和Boto API 2。X连接到AWS S3桶。我有一个独特的情况,我想从S3桶下载文件,从一个特定的目录/文件夹,说myBucket/foo/
。但问题是我想在S3文件夹中留下一个最新的文件,而不是下载它。一旦我在本地机器上下载了这些文件,我想将这些文件移到同一桶下的另一个文件夹,比如myBucket/foo/bar/
。以前有人遇到过类似的情况吗?
下面是一些解释:
- 将下载的文件从S3桶移动到同一桶下的不同文件夹路径
我的S3桶:事件日志S3桶上下载文件的文件夹路径:
event-logs/apps/raw/source_data/
S3桶上的文件夹路径,下载的文件将被移动(存档):
event-logs/apps/raw/archive_data/
注意:"event-logs/apps/raw/"路径通常在上面的同一个桶
下。如果S3上的source_data文件夹下有5个文件
s3://event-logs/apps/raw/source_data/data1.gz
event-logs/apps/raw/source_data/data2.gz
event-logs/apps/raw/source_data/data3.gz
event-logs/apps/raw/source_data/data4.gz
event-logs/apps/raw/source_data/data5.gz
我需要下载前4个文件(最旧的文件)到我的本地机器,并留下最新的文件,即data5.gz
后面。下载完成后,将这些文件从S3 ../source_data
文件夹移动到同一S3桶下的../Archive_data
文件夹,并从原始source_data文件夹中删除。下面是我的代码,用于列出S3中的文件,然后下载文件,然后删除文件。
AwsLogShip = AwsLogShip(aws_access_key, aws_secret_access_key, use_ssl=True)
bucket = AwsLogShip.getFileNamesInBucket(aws_bucket)
def getFileNamesInBucket(self, aws_bucket):
if not self._bucketExists(aws_bucket):
self._printBucketNotFoundMessage(aws_bucket)
return list()
else:
bucket = self._aws_connection.get_bucket(aws_bucket)
return map(lambda aws_file_key: aws_file_key.name, bucket.list("apps/raw/source_data/"))
AwsLogShip.downloadAllFilesFromBucket(aws_bucket, local_download_directory)
def downloadFileFromBucket(self, aws_bucket, filename, local_download_directory):
if not self._bucketExists(aws_bucket):
self._printBucketNotFoundMessage(aws_bucket)
else:
bucket = self._aws_connection.get_bucket(aws_bucket)
for s3_file in bucket.list("apps/raw/source_data"):
if filename == s3_file.name:
self._downloadFile(s3_file, local_download_directory)
Break;
AwsLogShip.deleteAllFilesFromBucket(aws_bucket)
def deleteFilesInBucketWith(self, aws_bucket, filename):
if not self._bucketExists(aws_bucket):
self._printBucketNotFoundMessage(aws_bucket)
else:
bucket = self._aws_connection.get_bucket(aws_bucket)
for s3_file in filter(lambda fkey: filename(fkey.name), bucket.list("apps/raw/source_data/")):
self._deleteFile(bucket, s3_file)
我真正想要实现的是:
- 选择要下载的最旧文件列表,这意味着总是将最新修改的文件留在后面,而不对其执行任何操作(因为这个想法是文件可能尚未准备好下载或仍在写入)。
- 与下载的文件列表相同。需要移动到同一桶下的新位置,并从原始source_data文件夹中删除。
我就是这样解决这个问题的!
bucket_list = bucket.list(prefix='Download/test_queue1/', delimiter='/')
list1 = sorted(bucket_list, key= lambda item1: item1.last_modified)
self.list2 = list1[:-1]
for item in self.list2:
self._bucketList(bucket, item)
def _bucketList(self,bucket, item):
print item.name, item.last_modified