Aws Comsumend stworzył plik o nazwie output.tar.gz w wiadrze S3.

Próbuję załadować ten plik w pamięci z Pythonem i próbowałem:

import boto3
from io import BytesIO
import gzip

s3 = boto3.client("s3")
obj = s3.get_object(Bucket=BUCKET, Key=KEY)
mycontentzip = gzip.GzipFile(fileobj=BytesIO(obj['Body'].read())).read()
lines = mycontentzip.decode("utf-8")

Próbowałem też rozwiązania na tym poście, w tym już nie potrzebując BYTESIO: Czytanie zawartości pliku GZIP z Aws S3 w Pythonie

Jestem w stanie użyć tych rozwiązań, aby zwrócić plik testowy, który nie jest .gz, aby mieć pewność, że mogę prawidłowo połączyć się z wiadrem S3.

We wszystkich próbach, co jest zwracany, to plik, który jest tylko następujący:

00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x...

Używam Python = 3.7.7 Boto3 = 1.10.5

Próbowałem również ręcznie pobrać plik z konsoli AWS. Dziwnie, plik rozpowszechniający w MacOS 10.15.6 jako plik `.jsonl '. Jednak otwiera się dobrze, aby zobaczyć w Vscode jako JSON.

Czy ktoś inny miał z tym kłopoty?

Z góry dziękuję za wszelkie pomysły.

# -----------------------------------------------

AKTUALIZACJA

Dzięki @akx. Tarfile jest. Znalezione w dokumentach jest tryb odczytu GZIP w module Tarfile: HTTPS: // Docs. Python.org/3/library/tarfile.html.

s3 = boto3.resource("s3")
obj = s3.Object(BUCKET, KEY)    
tar = tarfile.open(fileobj=BytesIO(obj.get()["Body"].read()), mode='r|gz')
tar.extractall('tmp_folder')

Próbowałem przeczytać pojedynczy plik w archiwum w pamięci, ale łatwiej było zapisać go na dysku i ponownie go przeczytać. Pracuję z małą ilością danych.

0
Dlewis 30 lipiec 2020, 00:00

1 odpowiedź

Najlepsza odpowiedź

To plik tar.gz, tj. Archiwum tar, który został skompresowany z algorytmem gzip.

Jeśli tylko przeczytasz go za pomocą gzip.GzipFile(), nadal masz archiwum binarne, musisz interpretować.

Użyj modułu tarfile, aby go przeczytać; Archiwa smoły, takie jak zamki, mogą zawierać wiele plików, z których jeden jest plik .jsonl, który kończysz.

1
AKX 29 lipiec 2020, 21:03