我有AWS S3访问权限,并且存储桶中有近300个文件。我需要通过模式匹配或搜索从这个桶下载单个文件,因为我不知道确切的文件名(Say文件以.csv格式结尾)。
这是我的示例代码,显示了存储桶中的所有文件
def s3connection(credentialsdict):
"""
:param access_key: Access key for AWS to establish S3 connection
:param secret_key: Secret key for AWS to establish S3 connection
:param file_name: file name of the billing file(csv file)
:param bucket_name: Name of the bucket which consists of billing files
:return: status, billing_bucket, billing_key
"""
os.environ['S3_USE_SIGV4'] = 'True'
conn = S3Connection(credentialsdict["access_key"], credentialsdict["secret_key"], host='s3.amazonaws.com')
billing_bucket = conn.get_bucket(credentialsdict["bucket_name"], validate=False)
try:
billing_bucket.get_location()
except S3ResponseError as e:
if e.status == 400 and e.error_code == 'AuthorizationHeaderMalformed':
conn.auth_region_name = ET.fromstring(e.body).find('./Region').text
billing_bucket = conn.get_bucket(credentialsdict["bucket_name"])
print billing_bucket
if not billing_bucket:
raise Exception("Please Enter valid bucket name. Bucket %s does not exist"
% credentialsdict.get("bucket_name"))
for key in billing_bucket.list():
print key.name
del os.environ['S3_USE_SIGV4']
我可以通过搜索字符串来检索完全匹配的文件名吗?
答案 0 :(得分:1)
没有办法执行此操作,因为S3中没有regex
的本机支持。您必须获取整个列表并在客户端应用搜索/正则表达式。 list_objects
中唯一可用的过滤选项是prefix
。
Prefix(string) - 限制对以#开头的键的响应 指定的前缀。
一种选择是使用Python模块re
并将其应用于对象列表。
import re
pattern = re.compile(<file_pattern_you_are_looking_for>)
for key in billing_bucket.list():
if pattern.match(key.name):
print key.name
答案 1 :(得分:0)
您也可以使用简单的if条件,例如
prefix_objs = buck.objects.filter(Prefix="your_bucket_path")
for obj in prefix_objs:
key = obj.key
if key.endswith(".csv"):
body = obj.get()['Body'].read()
print(obj.key)
答案 2 :(得分:0)
您可以使用 JMESPath 表达式来搜索和过滤 S3 文件。为此,您需要通过 list_objects_v2
获取 s3 分页器。
import boto3
client = boto3.client('s3')
paginator = client.get_paginator('list_objects_v2')
page_iterator = paginator.paginate(Bucket="your_bucket_name")
现在您有了迭代器,您可以使用 JMESPath 搜索。
最有用的是 contains - 做 %like%
查询
objects = page_iterator.search("Contents[?contains(Key, `partial-file-name`)][]")
但就您而言(要查找以 .csv
结尾的所有文件,最好使用 ends_with - 执行 *.csv
查询
objects = page_iterator.search("Contents[?ends_with(Key, `.csv`)][]")
然后你可以用
获取对象键for item in objects:
print(item['Key'])
此答案基于 https://blog.jeffbryner.com/2020/04/21/jupyter-pandas-analysis.html 和 https://stackoverflow.com/a/27274997/4587704