如何 copy/move 从 S3 存储桶下载的文件到同一存储桶下的不同文件夹而不是下载加载最新文件
How to copy/move the downloaded files from S3 bucket to a different folder under the same bucket and not download load the latest file
我正在使用 python 2.7.x 和 Boto API 2.X 连接到 AWS S3 存储桶。我有一个独特的情况,我想从 S3 存储桶下载文件到特定 directory/folder 说 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/"路径在同一个bucket下面是通用的
所以如果我在 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)
我真正想在这里实现的是:
- Select 要下载的最旧文件的列表,这意味着始终保留最新修改的文件并且不对其执行任何操作(因为这个想法是文件可能尚未准备好下载或者它是还在写)。
- 下载的相同文件列表..需要移动到同一存储桶下的新位置,并从原始 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
我正在使用 python 2.7.x 和 Boto API 2.X 连接到 AWS S3 存储桶。我有一个独特的情况,我想从 S3 存储桶下载文件到特定 directory/folder 说 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/"路径在同一个bucket下面是通用的
所以如果我在 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)
我真正想在这里实现的是:
- Select 要下载的最旧文件的列表,这意味着始终保留最新修改的文件并且不对其执行任何操作(因为这个想法是文件可能尚未准备好下载或者它是还在写)。
- 下载的相同文件列表..需要移动到同一存储桶下的新位置,并从原始 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