Próbuję przesyłać strumieniowo plik .gz z S3 przy użyciu boto i iterować po liniach rozpakowanego pliku tekstowego. Tajemniczo pętla nigdy się nie kończy; gdy cały plik zostanie odczytany, iteracja zostanie uruchomiona ponownie na początku pliku.Nieskończona pętla podczas przesyłania strumieniowego pliku .gz z S3 przy użyciu boto
Powiedzmy utworzyć i przesłać plik wejściowy jak następuje:
> echo '{"key": "value"}' > foo.json
> gzip -9 foo.json
> aws s3 cp foo.json.gz s3://my-bucket/my-location/
i uruchom następujące Pythona skrypt:
import boto
import gzip
connection = boto.connect_s3()
bucket = connection.get_bucket('my-bucket')
key = bucket.get_key('my-location/foo.json.gz')
gz_file = gzip.GzipFile(fileobj=key, mode='rb')
for line in gz_file:
print(line)
wynik jest:
b'{"key": "value"}\n'
b'{"key": "value"}\n'
b'{"key": "value"}\n'
...forever...
Dlaczego to się dzieje? Myślę, że musi być coś bardzo podstawowego, czego mi brakuje.
+1: to jest genialne. W rzeczywistości, używając swojego opakowania, mogę odczytać pandas DataFrame bezpośrednio ze skompresowanego obiektu S3. Dzięki! –
Nice! Odnosi się to równie dobrze do pobrań plików CSV, które dla mnie również wykazywały dziwne zachowanie, takie jak koniec pliku, łączący się z początkiem. Chciałbym wiedzieć, dlaczego boto robi rzeczy w ten sposób - bardzo duże wrażenie IMO – killthrush
Warto również zwrócić uwagę, kiedy uruchamiam to rozwiązanie jako menedżer kontekstu, potrzebowałem również funkcji 'close'. Po prostu przekazuje 'close' do' self.key.close() '. – killthrush