Как прочитать содержимое из tar-файла в лямбда-функции в AWS

#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()’.