Python Asynchroner .tar-Dateidownload und Verarbeitung

Woodz

Lieutenant
Registriert
Apr. 2009
Beiträge
719
Hallo.

Ich möchte gern .tar-Dateien asynchron downloaden und aus dem Arbeitsspeicher direkt verarbeiten ohne sie vorher auf der Platte speichern zu müssen.

Hier mein Quelltext:

Python:
import aiohttp
import asyncio
import tarfile

urls = [
    'https://opendata.dwd.de/weather/radar/composite/wn/composite_wn_20250604_0950.tar',
    'https://opendata.dwd.de/weather/radar/composite/wn/composite_wn_20250604_0955.tar',
    'https://opendata.dwd.de/weather/radar/composite/wn/composite_wn_20250604_1000.tar'
]


# =======================================================================================
async def main(urls):
        
    try:
        async with aiohttp.ClientSession() as session:
            ret = await asyncio.gather(*(get(url, session) for url in urls))
    
    except Exception as e:
        print(f'{e}')
                                      
# =======================================================================================                   
async def get(url, session):
 
    try:
                    
        async with session.get(url=url) as response:
                    
            if response.ok:
                    
               requested_file = await response.read()
                            
               with tarfile.open(requested_file, 'r') as tar:
                        
                   print(tar.getmembers())
                        
            else:
                print(response.reason)
                
    except Exception as e:
        print(f'{e}')
        
# =======================================================================================       
asyncio.run(main(urls))

Das Problem ist, dass ich als Fehlerausgabe immer "embedded null byte" erhalte. Auch ein Verarbeiten mittels io.BytesIO() liefert nicht das gewünschte Ergebnis. Da erhalte ich die Fehlermeldung "expected str, bytes or os.PathLike object, not BytesIO".

Hat hier jemand eine Idee?

Grüße
 
Ich glaube nicht, dass das hilft, denn (davon gehe ich aus) tarfile.open erwartet einen Dateinamen und keine Byte-Menge. Also wenn ich den Code und den Wunsch richtig deute, ist requested_file ja kein Dateiname sondern der Dateiinhalt. (Es geht nichts über klare Bezeichnungen)
Aus dem Dateiinhalt einen Dateinamen zu machen ergibt für mich keinen Sinn.

Noch allgemein und vielleicht auch nicht für Python und die Implementierung gültig:
Ich könnte mir vorstellen, dass es keine gute Idee ist, die Response quasi wie eine Datei zu behandeln. Eine Response kann i.d.R. genau einmal ausgelesen werden - ganz im Gegensatz zum Zugriff auf eine Datei, der üblicherweise wahlfrei, also nicht zwingend sequentiell ist.

Die Response eben einmal komplett in einen Bereich lesen und dann, das was gelesen wurde, entsprechend behandeln.

Edit: tarfile.open akzeptiert wohl auch ein File-Objekt, wenn ich die Doku richtig verstehe, aber das ist kein Byte-Objekt sondern ein Objekt, das eine geöffnete Datei repräsentiert, und ich habe wie gesagt meine starken Zweifel, dass der Response-Stream ist halt aus meiner Sicht kein File-Objekt.
 
Zuletzt bearbeitet:
ohne das getestet zu haben sieht die Doku von tarfile.open so aus:
Python:
tarfile.open(name=None, mode='r', fileobj=None, bufsize=10240, **kwargs)

d.h. dass du dein Ergebnis von "response.read()" in den "name" von tarfile.open() übergibst. Dort wird aber ein Dateipfad erwartet. Du müsstest mit fileobj=requested_file arbeiten.

evtl. könntest du hier passende Beispiele finden:
https://www.nintoracaudio.dev/data-eng,python/2024/11/06/tar-stream
 
  • Gefällt mir
Reaktionen: tollertyp
Zurück
Oben