Hallo Liebe Community,
ich sitze vor einer Programmieraufgabe.
Ich soll ein Programm schreiben, welches eine Datei einliest und dann jedesmal wenn bestimmte Texte auftaucht diese Zählt.
Das habe ich auch soweit schon fertig. Das Problem ist nun, dass ich die Datei aktuell selber herunterlade und lokal speichere. Genau das ist aber nicht erwünscht.
Die Datei soll vom Programm selbst heruntergeladen werden und eingelesen werden. Dabei wäre es am besten, wenn es NICHT erst zu einem kompletten download kommt, dann die Datei abgearbeitet wird und anschließend wieder gelöscht wird. Perfekt wäre es also, wenn die Datei während des downloads prozessiert wird ohne dass sie auf der Festplatte gespeichert wird.
Die Datei ist in tausende Abschnitte unterteilt, welche durch wiederkehrende Sonderzeichen eindeutig voneinander getrennt sind.
Ich wäre dankbar für ein paar Tips, wie man dieses Problem angehen könnte.
Liebe Grüße
Horst
Dateieinlesung während des Downloads
- sls
- User
- Beiträge: 480
- Registriert: Mittwoch 13. Mai 2015, 23:52
- Wohnort: Country country = new Zealand();
Dann verarbeite die Datei als Stream, Python stellt dir für diese Aufgabe io.BytesIO / io.StringIO zur Verfügung. So kannst du die Download-Datei in den RAM laden und musst keine temporäre Datei auf Platte schreiben.
When we say computer, we mean the electronic computer.
Naja, ich hab einen Link...
https://.....
Da kann ich dann die Datei normal runterladen...
Ich erwarte keine Fertig Lösung von euch, aber könnt ihr mir vielleicht ein bischen mehr helfen, wie das mit dem Stream funktioniert? Oder wisst ihr zufällig eine Seite, wo ich mir das gut anlesen könnte?
Das wäre echt super nett, wenn das möglich wäre
https://.....
Da kann ich dann die Datei normal runterladen...
Ich erwarte keine Fertig Lösung von euch, aber könnt ihr mir vielleicht ein bischen mehr helfen, wie das mit dem Stream funktioniert? Oder wisst ihr zufällig eine Seite, wo ich mir das gut anlesen könnte?
Das wäre echt super nett, wenn das möglich wäre
Zuletzt geändert von Horst73 am Dienstag 5. Juni 2018, 17:21, insgesamt 1-mal geändert.
- sls
- User
- Beiträge: 480
- Registriert: Mittwoch 13. Mai 2015, 23:52
- Wohnort: Country country = new Zealand();
Dann benutze eine Library, mit welcher du die Ressource herunterladen kannst? Z.B. Requests. Da wird auch nichts automatisch lokal gespeichert sondern steht dir erstmal nur via Objekt in Python (RAM-Ressource) zur Verfügung.
When we say computer, we mean the electronic computer.
Zum herunterladen von HTTP-Dateien gibt es diverse Bibliotheken, angefangen von der eingebauten urllib bis zu komfortableren externen Modulen requests. Und etwas fortgeschritten https://aiohttp.readthedocs.io/en/stable/ fuer das asyncio-Framework in Python. Das brauchst du, wenn du nicht nur nicht speichern willst, sondern der Datenstrom auch zu gross fuer deinen Arbeitsspeicher wird.
@__deets__: auch für alle anderen Methoden kann man den Download als Stream behandeln, ohne dass man ihn komplett in den Arbeitsspeicher laden muß. Dafür ist aiohttp nicht nötig. Das hat nur Vorteile, wenn man viele Dateien parallel verarbeiten will.
- DeaD_EyE
- User
- Beiträge: 1021
- Registriert: Sonntag 19. September 2010, 13:45
- Wohnort: Hagen
- Kontaktdaten:
Mit asyncio würde ich noch etwas warten. Erst, wenn du Python verstehst, solltest du dich auf asyncio stürzen.
Um mit einem Stream zu arbeiten, muss man das etwas anders machen. Das geht mit requests sicherlich auch.
Jedenfalls lädt requests.get() den kompletten Inhalt in den RAM.
Bei sehr großen Dateien kann sich das bemerkbar machen. Erst muss der komplette Inhalt im RAM sein, bevor dann letztendlich die Auswertung kommt.
Wenn man mit einem Datenstrom arbeitet, bekommt man die Daten auf gesplittet in gleich große Teile.
Hier wird beschrieben, wie man mit einem Datenstrom arbeitet: http://docs.python-requests.org/en/mast ... t-workflow
Innerhalb der for Schleife kannst du dann mit line arbeiten.
Code: Alles auswählen
import requests
# vorher mit pip installieren
# pip3 install requests --user
req = requests.get('addresse')
# ab hier hat das zurückgelieferte Objekt bereits den Inhalt
inhalt = req.content # Bytes
text = req.text # Str
Jedenfalls lädt requests.get() den kompletten Inhalt in den RAM.
Bei sehr großen Dateien kann sich das bemerkbar machen. Erst muss der komplette Inhalt im RAM sein, bevor dann letztendlich die Auswertung kommt.
Wenn man mit einem Datenstrom arbeitet, bekommt man die Daten auf gesplittet in gleich große Teile.
Hier wird beschrieben, wie man mit einem Datenstrom arbeitet: http://docs.python-requests.org/en/mast ... t-workflow
Code: Alles auswählen
with requests.get('http://httpbin.org/get', stream=True) as r:
for line in r.iter_lines():
# code zur Auswertung
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Vielen vielen Dank an DeaD_EyE! Habs mit deiner Hilfe jetzt hin bekommen. Funktioniert einwandfrei das Programm. Genau wie gewünscht.
Jetzt sind nur noch eine Kleinigkeit. Während des downloads blinkt der curser einfach nur und man sieht keinen Fortschritt. Kann man den auf einfache Art und Wiese darstellen?
Jetzt sind nur noch eine Kleinigkeit. Während des downloads blinkt der curser einfach nur und man sieht keinen Fortschritt. Kann man den auf einfache Art und Wiese darstellen?
ne,
geht nicht
Code: Alles auswählen
print statements
- __blackjack__
- User
- Beiträge: 13111
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Warum nicht?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Ah, ok.
Ja jetzt weiß ich wie du das meinst. Also die Datei wird zeilenweise eingelesen und abgearbeitet. Gibt es denn einen Befehl, mit dem ich vorab die Anzahl der Zeilen in der datei abfragen kann? Dann könnte ich natürlich problemlos den Fortschritt berechnen...
Ich hätte noch eine Frage: Gibt es eine Möglichkeit, die url in einer varriablen zu speichern? Mit sicherheit, denke ich. Kann mir einer die Syntax dafür sagen? Also in etwa so nur als korrekten Code...
Ich bin euch bisher unendlich dankbar, wie ihr mir bisher geholfen habt
Lg Horst
Ja jetzt weiß ich wie du das meinst. Also die Datei wird zeilenweise eingelesen und abgearbeitet. Gibt es denn einen Befehl, mit dem ich vorab die Anzahl der Zeilen in der datei abfragen kann? Dann könnte ich natürlich problemlos den Fortschritt berechnen...
Ich hätte noch eine Frage: Gibt es eine Möglichkeit, die url in einer varriablen zu speichern? Mit sicherheit, denke ich. Kann mir einer die Syntax dafür sagen? Also in etwa so nur als korrekten Code...
Code: Alles auswählen
url="http://mein-server.de/datei.dat
with requests.get('url', stream=True) as r:
Lg Horst
nein, die Anzahl der Zeilen kannst Du nur herausfinden, wenn Du die ganze Datei gelesen hast. Was geht, ist die Größe der Datei in Bytes aus dem Header Content-Length zu lesen, falls der Server sie mitschickt.
Variablen kann man so benutzen, wie man sie immer benutzt, nicht als String.
Variablen kann man so benutzen, wie man sie immer benutzt, nicht als String.