Problem aus dem Linux-Club

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
abgdf

Hallo,

hier

http://www.linux-club.de/viewtopic.php?f=28&t=98852

habe ich versucht, jemandem ein Python-Skript anzubieten.
Bei mir klappt das auch, aber der OP dort sagt, er erhalte einen Fehler (jemand anders sagte das auch)

Wißt ihr, woran das liegt ? Bin jetzt auf Perl ausgewichen, aber das kann ja nicht Sinn der Sache sein ...

Viele Grüße
BlackJack

@abgdf: `sre` ist schon seit Ewigkeiten "deprecated", und bei mir (Python 2.5) wird beim ``import`` auch eine entprechende Warnung ausgegeben.

Die Namen sind indiskutabel und das Ganze sieht auch zu kompliziert aus. Reguläre Audrücke braucht man hier nicht. Das geht auch mit `str.rsplit()`.

Zur Fehlersuche sollte man vielleicht die Zeile wo's kracht mit `repr()` und ``print`` ausgeben. Vielleicht ist ja eine Leerzeile am Ende der Datei oder so.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Ohman, die Forensoftware (wahrscheinlich selbst gehackt) ist grottig.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dauerbaustelle hat geschrieben:Ohman, die Forensoftware (wahrscheinlich selbst gehackt) ist grottig.
Das ist hüben wie drüben phpBB. Grottig ja, aber selbstgemacht nein. Sowas übles produzieren wir hier nicht 8)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

@Leonidas: Ich meine die von der oben genannten Seite 8)
Aber phpBB ist allein schon wegen den ersten drei Buchstaben eklig ;)

Edit: AArgh, war schon spät gestern, die beiden Antworten gehören eigentlich hier http://www.python-forum.de/topic-16707.html hin -.-
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Natürlich konnte ich nicht widerstehen und möchte nun auch meine Lösung zum Besten geben ;)

Code: Alles auswählen

from collections import defaultdict
import sys

LIMIT = 10

if __name__ == '__main__':
    urls = defaultdict(float)
    for line in sys.stdin:
        url, access_time = line.strip().split(' ', 1)
        urls[url.strip("'")] += float(access_time)
    results = ((access_time, url) for url, access_time in urls.iteritems())
    for result in sorted(results, reverse=True)[:LIMIT]:
        print '%8.4f  %s' % result
Oder die letzten drei Zeilen alternativ zusammengefasst, jedoch mit zusätzlichem Import:

Code: Alles auswählen

from operator import itemgetter

    # [...]
    for url, access_time in sorted(urls.iteritems(), key=itemgetter(1), reverse=True)[:LIMIT]:
        print '%8.4f  %s' % (access_time, url)
Ein schöner Anwendungsfall für ein `defaultdict`. Zudem entfällt hier die `with`-Statement-Diskussion, weil einfach in guter Unix-Tradition die Interoperabilität mit anderen Tools leicht gemacht wird und das Progrämmchen seine Daten über die Standardeingabe erhält: `cat data.txt | python script.py` - geht mit `type` anstelle von `cat` auch unter Windows.

Man könnte ein `sort` (gibt's nicht von Haus aus unter Windows) vorschalten und im Code dann `itertools.groupby` verwenden (dafür müssen die Daten vorsortiert sein) oder man sortiert selbst. Insgesamt dürfte das dann aber weit umständlicher werden. So wie jetzt ist die Reihenfolge der Datenzeilen egal. Aufsplittung der Zeilen sowie Sortierung, Limitierung und Formatierung der Ergebnisse geht mit UNIX-Tools (`awk`/`cut`/, `sort`, `head`, ...) auch schön, ist aber eben mehr oder weniger in der Plattform eingeschränkt - hier spielt Python ja seinen Vorteil aus.
lunar

Y0Gi hat geschrieben:`cat data.txt | python script.py` - geht mit `type` anstelle von `cat` auch unter Windows.
Useless use of cat ... Umleitungsoperatoren existieren.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Zeig.

Ach, du meinst `data.txt < python script.py`? Das vergesse ich gerne.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Y0Gi hat geschrieben:Ach, du meinst `data.txt < python script.py`?
Eher ``python script.py < data.txt`` oder ``python script.py > data.txt``, je nachdem ob Input oder Output. Aber ja, das vergesse ich auch gerne.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Leonidas hat geschrieben:
Y0Gi hat geschrieben:Ach, du meinst `data.txt < python script.py`?
Eher ``python script.py < data.txt`` oder ``python script.py > data.txt``, je nachdem ob Input oder Output. Aber ja, das vergesse ich auch gerne.
Oder gleich so: python script.py < data.txt > newdata.txt
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Jetzt ist mir wieder klar, warum ich im Zweifelsfall `cat` verwende ;)

Leonidas hat geschrieben:Eher ``python script.py < data.txt`` oder ``python script.py > data.txt``, je nachdem ob Input oder Output. Aber ja, das vergesse ich auch gerne.
Überschreibt das zweite Statement nicht die `data.txt` mit der Programmausgabe?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Y0Gi hat geschrieben:
Leonidas hat geschrieben:Eher ``python script.py < data.txt`` oder ``python script.py > data.txt``, je nachdem ob Input oder Output. Aber ja, das vergesse ich auch gerne.
Überschreibt das zweite Statement nicht die `data.txt` mit der Programmausgabe?
Ja, aber wenn man den Output in data.txt haben will ("je nachdem ob Input oder Output") dann ist es auch das richtige.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Dann kommen aber nirgends die Daten her ;)

(Ja, mir ist klar, was du aufzeigen wolltest.)
Antworten