URL mit Textdatei aufrufen - zeilenweise lesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
tadeus
User
Beiträge: 10
Registriert: Donnerstag 8. Oktober 2009, 14:38

Hallo,

ich habe eine Url mit einer Textdatei, welche folgenden Inhalt hat

Code: Alles auswählen

2013-09-27_10:27 , 2013-09-27_16:26 , IrgendEinVerwendungszweck
2013-09-24_17:25 , 2013-09-24_18:28 , asdf
2013-09-25_18:26 , 2013-09-25_17:27 , asdf
2013-09-30_19:26 , 2013-09-30_19:27 , adf
2013-10-03_01:26 , 2013-10-11_16:17 , asasdf
Diese Textdatei möchte ich Zeile für Zeile durchgehen und gucken ob die aktuelle Zeit zwischen den angegeben Zeiten liegt. Leider scheitere ich schon am Anfang.

Ich weiß zwar, dass man mit folgendem Code die Url holt und in eine Variable einliest.

Code: Alles auswählen

link = "http://url/main.txt"
f = urllib.urlopen(link)
text = f.read()
Aber wie ich dann diese text Variable zeilenweise durchgehe, damit ich die Zeile mit string.split() in seine Einzelteile zerlegen kann, weiß ich nicht.

Wie geht das in python? Oder gibts da ne sauberere Lösung?

Danke vorab
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Code: Alles auswählen

url = "http://url/main.txt"
with urllib.urlopen(url) as f:
    lines = f.read().split('\n')
for line in lines:
    process_line(line)
oder eben gleich zeilenweise arbeiten:

Code: Alles auswählen

url = "http://url/main.txt"
with urllib.urlopen(url) as f:
    for line in f:
        process_line(line)
tadeus
User
Beiträge: 10
Registriert: Donnerstag 8. Oktober 2009, 14:38

Danke schon mal. Das mit dem "with" kannte ich noch nicht.

Code: Alles auswählen

python test2.py
Traceback (most recent call last):
  File "test2.py", line 12, in <module>
    with urllib.urlopen(link) as f:
AttributeError: addinfourl instance has no attribute '__exit__'
Was für ein exit benötige ich da?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Entschuldige, `urllib.urlopen` gibt nur ein File-like Objekt zurueck, keinen ganzen Kontextmanager (wie ein "normales" `open` das tut).
In dem Fall hilft `contextlib.closing`, das eine `__exit__` Methode erstellt die `close` aufruft.

Code: Alles auswählen

from contextlib import closing

with closing(urlllib.urlopen(url)) as f:
    ...
tadeus
User
Beiträge: 10
Registriert: Donnerstag 8. Oktober 2009, 14:38

Ich hab vorhin eine einfachere Variante gefunden

Code: Alles auswählen

data = urllib.urlopen(link)
lines = data.readlines()
for line in lines: ......
geht doch, man muss nur wissen wie ^^ :)

Danke nochmal
BlackJack

@tadeus: Einfacher wäre es die zweite Zeile einfach wegzulassen, die ist nicht nötig.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Und noch einfacher wäre es, das Requests-Modul zu benutzen :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@tadaeus: Das ist effektiv meine 2. Variante in kompliziert und ohne die Ressource zu schliessen.
Antworten