Seite 1 von 1
Problem aus dem Linux-Club
Verfasst: Freitag 14. November 2008, 21:18
von 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
Verfasst: Freitag 14. November 2008, 21:37
von 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.
Verfasst: Samstag 15. November 2008, 01:17
von Dauerbaustelle
Ohman, die Forensoftware (wahrscheinlich selbst gehackt) ist grottig.
Verfasst: Samstag 15. November 2008, 01:23
von Leonidas
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

Verfasst: Samstag 15. November 2008, 10:41
von Dauerbaustelle
@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 -.-
Verfasst: Samstag 15. November 2008, 14:29
von Y0Gi
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.
Verfasst: Samstag 15. November 2008, 14:52
von 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.
Verfasst: Samstag 15. November 2008, 16:04
von Y0Gi
Zeig.
Ach, du meinst `data.txt < python script.py`? Das vergesse ich gerne.
Verfasst: Samstag 15. November 2008, 16:35
von Leonidas
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.
Verfasst: Sonntag 16. November 2008, 10:18
von helduel
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
Verfasst: Sonntag 16. November 2008, 11:54
von Y0Gi
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?
Verfasst: Sonntag 16. November 2008, 12:06
von Leonidas
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.
Verfasst: Montag 17. November 2008, 13:29
von Y0Gi
Dann kommen aber nirgends die Daten her
(Ja, mir ist klar, was du aufzeigen wolltest.)