#python #amazon-web-services #amazon-s3 #aws-lambda #boto3
#python #amazon-веб-сервисы #amazon-s3 #aws-лямбда #boto3
Вопрос:
Я хочу прочитать содержимое, которое находится внутри файла .tar, не извлекая файл tar. Я попробовал свою локальную машину и успешно, я могу прочитать содержимое файла. Просто я передал путь к файлу .tar. Для этого я использовал одну библиотеку под названием tarfile. С помощью этой библиотеки я это сделал. Теперь я пытаюсь сделать то же самое в AWS, используя лямбда-функцию, но я не могу этого сделать. Можете ли вы предложить какую-либо альтернативу для этого?
import tarfile
file_path = r'C:/Users/xyz/Downloads/abc.tar'
tar = tarfile.open(file_path, "r:gz")
for member in tar.getnames():
name = str(member)
if name.endswith(".txt"):
f = tar.extractfile(name)
if f:
for i in f:
print(str(i))
Код для AWS
s3 = boto3.client('s3')
Bucket='abc-logs'
if event:
for i in event:
file_obj = event["Records"][0]
Key = str(file_obj['s3']['object']['key'])
if file_name_split == 'PERFORMANCE':
print("Key",Key)
tar_file_obj = s3.get_object(Bucket='abc-logs',Key=Key)
# print(tar_file_obj)
# tar = tarfile.open(tar_file_obj["Body"],"r:gz")
# print(tar)
file_content = tar_file_obj["Body"].iter_lines()
print(file_content)
Ответ №1:
Вы можете прочитать содержимое tar-файла с помощью следующего подхода:
tar_file_obj = s3.get_object(Bucket='abc-logs',Key=Key)
tar_content = tar_file_obj ['Body'].read()
with tarfile.open(fileobj = BytesIO(tar_content)) as tar:
for tar_resource in tar:
if (tar_resource.isfile()):
inner_file_bytes = tar.extractfile(tar_resource).read()
Комментарии:
1. Этот ответ отлично сработал для меня, за исключением того, что строка 2 на самом деле должна быть ‘tar_content = tar_file_obj.get()[‘Body’].read()’.