Zum Forum springen
Benachrichtigungen
Alles löschen

Python Code verstehen

20 Beiträge
7 Benutzer
0 Reactions
1,419 Ansichten
MyLady17
Beigetreten: 11.03.2007

Hallo,

gibt es hier jemanden der mir helfen kann diesen Code zu verstehen? Ich hab nur ganz rudimentäre Kenntnisse davon und könnte Hilfe gebrauchen. Ich brauche Kenntnisse in Python um im nächsten Jahr mit NetworkX ein paar Netzwerke zu analysieren. Bisher habe ich keine Erfahrungen mi Programmiersprachen.

die .txt Dateien werfen für mich absolute Rätsel auf.

Im Pythonmodul verstehe ich nur, dass vom System 2 Dateien importiert werden.

ab: aid = []
lng = []
lat = []
for line in f.xreadlines():
if '\N' not in line:
tmp = line.split(',\"')
aid.append(int(tmp[0].replace('\"','')))
lng.append(tmp[5].split('\",')[1].split(',')[0])
lat.append(tmp[5].split('\",')[1].split(',')[1])

hört es allerdings komplett auf...

Kann mir jemand helfen??


Antwort
Zitat
19 Antworten
dusterl
Beigetreten: 14.07.2006
# 3 variablen werden leere Arrays zugewiesen
aid = []
lng = []
lat = []
# für jede Zeile aus der Datei auf die f zeigt mache folgendes
for line in f.xreadlines():
# wenn in der aktuellen Zeile ein anderes als das newline(Enter) Zeichen ist mache folgendes
    if '\N' not in line:
# trenne die aktuelle Zeile bei jedem Vorkommen von -> ," <- und speichere jedes Segment in tmp
        tmp = line.split(',\"')
# hänge das nullte Segment von tmp als Ganzzahl interpretiert an aid an und lösche jedes -> " <-
        aid.append(int(tmp[0].replace('\"','')))
# nimm das 5. segment von tmp. trenne davon die zeichenkette bei jedem -> ", <-. nimm davon das erste segment. trenne davon die zeichenkette bei jedem -> , <- und nimm davon das nullte segment.
        lng.append(tmp[5].split('\",')[1].split(',')[0])
# analog zu dem davor.
        lat.append(tmp[5].split('\",')[1].split(',')[1])

Antwort
Zitat
MyLady17
Beigetreten: 11.03.2007

from os import *

file1="airports.txt"
file2="flight_routes.txt"

f=file(file1,"r")
aid = []
lng = []
lat = []
for line in f.xreadlines():
if '\N' not in line:
tmp = line.split(',\"')
aid.append(int(tmp[0].replace('\"','')))
lng.append(tmp[5].split('\",')[1].split(',')[0])
lat.append(tmp[5].split('\",')[1].split(',')[1])
f.close()

f=file(file2,"r")
s = []
t = []
for line in f.xreadlines():
if '\N' not in line:
tmp = line.split(',')
s.append(int(tmp[3]))
t.append(int(tmp[5]))
try:
print lng[aid.index(int(tmp[3]))],lat[aid.index(int(tmp[3]))],lng[aid.index(int(tmp[5]))],lat[aid.index(int(tmp[5]))]
except:
pass


Antwort
Zitat
dusterl
Beigetreten: 14.07.2006

oben editiert


Antwort
Zitat
MyLady17
Beigetreten: 11.03.2007

cool! Vielen dank für die schnelle Hilfe. Kannst du mir Tipps geben wie ich mir da am schnellsten Wissen dazu aneigne? Hab das Buch "Python kinderleicht" zur Hälfte durch. Ich muss damit keine Anwendungen programmieren, sondern eben solche .txt Dateien auslesen und später mit NetworkX visualisieren


Antwort
Zitat
dusterl
Beigetreten: 14.07.2006

Ne Sorry. Hab noch nie was in Python gemacht. Die Ähnlichkeit in der Codestruktur zu anderen Skriptsprachen reicht um den Code zu verstehen, aber Ratschläge zum Python lernen kann ich nicht geben.

Ach und oben die .txt Datei scheint in Unix Formatierung zu sein und mit Windows Notepad aufgemacht zu haben. Nimm lieber Wordpad o.Ä., dann wird auch korrekt ein Datensatz pro Zeile angezeigt.


Antwort
Zitat
MyLady17
Beigetreten: 11.03.2007

oh, danke. Ja, dann wirkt es gleich nicht mehr so diffus ^^


Antwort
Zitat
Milchbart0815
Beigetreten: 16.01.2007

Learning by doing :)

Im Prinzip findest du für fast alles Code-Schnipsel auf stackoverflow, also einfach googeln.
Ansonsten die kostenlosen Bücher auf galileo.
Im Prinzip ist Python ziemlich einfach, man muss nur ein wenig auf die Einrückungen achten.

Bzgl. NetworkX: Da solltest du dich viel eher mal in deren Doku einlesen. Gibt zwar für alles Beispiele, aber wenn du ein paar schönere Sachen machen willst, musst du schon ein bißchen verstehen, was da gemacht wird...ist ja auch alles in Python geschrieben und läuft bei komplizierteren Sachen nicht unbedingt mit copy&paste.


Antwort
Zitat
sarc
Beigetreten: 06.06.2008

Das Ding soll ziemlich gut sein: http://learnpythonthehardway.org/book/


Antwort
Zitat
MyLady17
Beigetreten: 11.03.2007

Original von Milchbart0815
Learning by doing :)

Im Prinzip findest du für fast alles Code-Schnipsel auf stackoverflow, also einfach googeln.
Ansonsten die kostenlosen Bücher auf galileo.
Im Prinzip ist Python ziemlich einfach, man muss nur ein wenig auf die Einrückungen achten.

Bzgl. NetworkX: Da solltest du dich viel eher mal in deren Doku einlesen. Gibt zwar für alles Beispiele, aber wenn du ein paar schönere Sachen machen willst, musst du schon ein bißchen verstehen, was da gemacht wird...ist ja auch alles in Python geschrieben und läuft bei komplizierteren Sachen nicht unbedingt mit copy&paste.

danke an dich + sarc.

kennst du dich mit beidem aus? Wie gesagt, ich hab das noch nie gemacht, mein Dozent meinte ich solle mir erst mal die Grundlagen erarbeiten. In meinem Fach ist es höchst unüblich so zu arbeiten, aber das ist es was mich reizt


Antwort
Zitat
moeeeee
Beigetreten: 24.08.2006

kannst ja auch mal hier schaun:

http://www.codecademy.com/de/tracks/python

was vielleicht auch hilft: http://overapi.com/python/


Antwort
Zitat
MisterJ
Beigetreten: 26.03.2006

Wo hast du denn den Code her?

Soll das ein Beispiel sein? Das ganze geht nämlich mit python sehr viel besser und wirkt umständlich.

Ich muss mich korrigieren: Ich habe mir das nochmal genauer angeschaut - der code ist schrecklich! Auf keinen Fall zum lernen/verstehen benutzen, wie man so etwas parsed!

Wenn du ein Beispiel für ordentlichen python code brauchst, lade die Rohdaten mal irgendwo hin. Das ganze sollten nur 5-10 Zeilen sein.

Edit 2: Nachtrag: Benutze das auf gar keinen Fall als Beispiel. Jedes mal, wenn ich es wieder anschaue wird das schlimmer...


Antwort
Zitat
flowIIpoker
Beigetreten: 14.02.2007

zur txt-datei das sind flughafendaten

Nr,Name,Ort,Land,IATA-Code,ICAO-Code,Pos-Lng,Pos-Lat,Hoehe(in ft) ü. MSL,UTC-Offset,sagt mir nix

edit: ich lerns einfach nicht erst Pos-Lat dann Pos-Lng also oben stehts falschrum


Antwort
Zitat
MyLady17
Beigetreten: 11.03.2007

Original von MisterJ
Wo hast du denn den Code her?

Soll das ein Beispiel sein? Das ganze geht nämlich mit python sehr viel besser und wirkt umständlich.

Ich muss mich korrigieren: Ich habe mir das nochmal genauer angeschaut - der code ist schrecklich! Auf keinen Fall zum lernen/verstehen benutzen, wie man so etwas parsed!

Wenn du ein Beispiel für ordentlichen python code brauchst, lade die Rohdaten mal irgendwo hin. Das ganze sollten nur 5-10 Zeilen sein.

Edit 2: Nachtrag: Benutze das auf gar keinen Fall als Beispiel. Jedes mal, wenn ich es wieder anschaue wird das schlimmer...

Der Code ist von meinem Dozenten, der ist aber selbst kein Programmierer. Er hat ihn mir gegeben um mich daran ein bisschen zu orientieren. Was ist denn das Problem damit?


Antwort
Zitat
flowIIpoker
Beigetreten: 14.02.2007

ist doch csv dafuer gibs nen modul

oder

ich hab dir doch oben die struktur erlaeutert
dann kann man schoen mit find() arbeiten
und denn string mit

string[anfang:ende] zerlegen

xreadline() ist deprecated

.......

so in etwa

#!/usr/bin/python

import csv  

aid = [] 
lng = [] 
lat = []  
name = []

file1 = csv.reader(open("airports.txt","rb"))  

for row in file1:     
    aid.extend(int(row[0]))
    lng.extend(row[6])
    lat.extend(float(row[7]))
    name.extend(row[1][1:-1])

Antwort
Zitat
MisterJ
Beigetreten: 26.03.2006

Ein paar Details:

a) Wie schon gesagt: Für csv gibts ein modul. Das parsed auch Strings mit " schon ordentlich, usw.

b) Unabhängig davon sind mir folgende Dinge aufgefallen (manche vielleicht etwas pedantisch, aber wenn du es zum Lernen nimmst dann auch gleich so gut wie möglich)

  • from os import * - besser import os
  • file1/file2 namen - besser filename_airports, filename_flight_routers
  • Könnte man auch einfach von cmd_line lesen mit defaults
  • f = file(...) - with statement -> with open(file1, "r") as f: (macht f.close() automatisch)
  • for line in f: (statt readlines)
  • if '\N' not in line: - nicht sicher was das bewirkt. Sollte doch entweder gar nichts oder alles filtern
  • Die parsing Logik ist einfach nur fehleranfällig (obwohl hier wohl richtig) -> csv reader
    Ansonsten: Warum sind das 3 Listen, statt einer Liste von Tupeln?
  • try/except pass. Erstens sollte man das except einschränken. Es catched nämlich mindestens zwei verschiedene Dinge (Ich denke mal nur eins ist evtl. gemeint). ValueErrors wenn der int cast fehlschlägt und IndexErrors, wenn die id nicht gefunden wird. Zweitens würde ich das komplett NICHT machen. Da es hier um automatisierte Daten geht werden so Fehler verschwiegen und es fehlen dadurch in der Ausgabe Daten. Also am besten komplett weglassen. Kann natürlich trotzdem sein, dass das in den Daten normal ist und man es deshalb so macht.
  • Das print statement ist die Krönung mit lng[aid.index(int(tmp[3]))] usw. Erstens könnte man es zur Lesbarkeit vielleicht mal auseinandernehmen mit indexA = aid.index(tmp[3]) usw. Zweitens erkennt man hier, dass das ganze halt einfach die komplett FALSCHE Datenstruktur von Anfang an ist.
    Das parsen des ersten files sollte die Daten in ein dict() parsen, dass aid->(lng,lat) mappt. Das kann man dann hier wunderbar anwenden zu: airports_dict[aid1].lng, airports_dict[aid1].lat, usw.

Wow, ich glaube ich habe es geschafft an keiner einzigen Zeile nichts auszusetzen zu haben

[/rant]


Antwort
Zitat
flowIIpoker
Beigetreten: 14.02.2007

zu dem dict()
kannste da mal nen brauchbaren link posten...

wuerde mich interessieren, da ich python eher so unternutze


Antwort
Zitat
MisterJ
Beigetreten: 26.03.2006

Ich könnte einfach den code mal so ordentlich schreiben, wie ich es machen würde.
Jetzt aber nicht mehr, bin gerade erst von einer Dienstreise zurück. Ich muss nur noch dran denken, das auch zu tun.

Das schöne an python ist, dass der bessere code meist auch kürzer ist.


Antwort
Zitat
flowIIpoker
Beigetreten: 14.02.2007

las dir ruhig zeit aber bitte nich vergessen :)


Antwort
Zitat
MisterJ
Beigetreten: 26.03.2006

Da ich morgen schon wieder unterwegs bin hier die adhoc Lösung. API kopiert von dir, Rest einfach so adaptiert. Kann zig syntaxfehler enthalten und mit NamedTuples wäre es noch etwas schöner. Also =0= garantien, aber die Idee dürfte klar sein.

#!/usr/bin/python
import csv  

file1 = csv.reader(open("airports.txt","rb"))  
airports = dict()
for row in file1:
    airports[int(row[0])] = (float(row[6]), float(row[7]),row[1][1:-1])

file2 = csv.reader(open("flights.txt", "rb"))
for row in file2:
    si = int(row[3])
    ti = int(row[5])
    print airports[si][0], airports[si][1], airports[gi][0], airports[gi][1]

Nochmal in super-faul mit dict/list comprehensions, wobei ichs mit named variablen hier schöne finde für's parsen:

#!/usr/bin/python
import csv  

file1 = csv.reader(open("airports.txt","rb"))  
airports = {int(row[0]) : (float(row[6]), float(row[7]),row[1][1:-1]) for row in file1}

file2 = csv.reader(open("flights.txt", "rb"))
routes = [(airports[int(row[3])][0], airports[int(row[3])][1], airports[int(row[]5)][0], airports[int(row[5])][1])]
print '\n'.join(routes)

Antwort
Zitat