Verständnisfrage Subroutine

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
LotharK
User
Beiträge: 51
Registriert: Sonntag 22. März 2015, 10:02

Hallo,

ich habe ein kleines Problem, was ich nicht so richtig verstehe.

Ich lese eine Datei mit Transpondern, Namen und Berechtigung ein.
Es gibt pro Transponder eine Zeile, deren Informationen durch Semikolon getrennt sind
Dieser Code funktioniert einwandfrei. Die Routine gibt mir die gesamte Datei gesplittet nach Semikolon zurück

Code: Alles auswählen

def load_transponders1(filename):
    with open(filename, 'r') as lines:
        return [line.split(';') for line in lines]
Da ich den Code nicht vollständig verstehe, wollte ich das ganze auf eine andere Art nachbauen.

Code: Alles auswählen

def load_transponders2(filename):
    with open(filename,'r') as lines:
      for line in lines:
          row=line.split(';')
    return[row]
Dieser Code gibt mir nur die letzte Zeile zurück. Das leuchtet mir sogar noch ein.
Was aber müsste ich tun um das gleiche Ergebnis zu erhalten?

Code: Alles auswählen

  FILENAME = 'Transponder.txt'
    

             
    #RFID_Nr='307e3a5b50'
    RFID_Nr=input('Transpondernunmmer ') 
    print (RFID_Nr)

    Erg1 = load_transponders1(FILENAME)
    Erg2 = load_transponders2(FILENAME)
       
    for row in Erg1:
       print ("Ergebnis 1: " + row[(0)] + " Nr1: " + row[(1)]+" Nr2: " + row[(2)]+ " Nr3: " +row[(3)])
       if (RFID_Nr == row[0]):
             print ("Mitarbeiter gefunden:" + row[2])
             
    for row in Erg2:
      print ("Ergebnis2 : " + row[(0)] + " Nr1: " + row[(1)]+" Nr2: " + row[(2)]+ " Nr3: " +row[(3)])
      if (RFID_Nr == row[0]):
            print ("Mitarbeiter gefunden:" + row[2])      
               

Könnte mich bitte mal jemand erleuchten?
Gruß Lothar
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Hallo, so gibst du nur das letzte Element zurück.

du müsstest allso jede row an eine Liste hinzufügen, versuch mal ob

Code: Alles auswählen

def load_transponders2(filename):
    rows = []
    with open(filename,'r', encoding = ???) as lines:
      for line in lines:
          row = line.split(';')
          rows.append(row)
    return rows
das gewünschte Ergebnis liefert, ich kann das leider nicht überprüfen da ich deine Daten die du einliest nicht habe.

Beim öffnen von Textdateien sollte auch das encoding mit angegeben werden

Strings stückelt man nicht mit + zusammen, sondern benutzt f-Strings, also so z.B.:

Code: Alles auswählen

print(f"Ergebnis 1: {row[0]} Nr1: {row[1]} Nr2: {row[2]} Nr3: {row[3]}")
Variablen werden klein_mit_unterstrich geschreiben, Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase)

Du solltest deinen Code auch nicht auf Modulebene schreiben. Überlicherweise gibt es eine main() Funktion und einen if __name__ == "__main__": Block, der die main() aufruft.
Sirius3
User
Beiträge: 18254
Registriert: Sonntag 21. Oktober 2012, 17:20

@LotharK: eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 4, mal 2 und mal 6.
Variablennamen werden komplett kein geschrieben und enthalten keine Abkürzungen, also erguesse statt erg.
Statt selbst einen csv-Leser zu programmieren (der noch deutlich komplexer wäre), benutzt man csv.reader.
Um die Bedingungen bei if kommen keine unnötigen Klammern.

Code: Alles auswählen

import csv
FILENAME = 'Transponder.txt'

def load_transponders(filename):
    with open(filename, newline="", enconding="ascii") as lines:
        reader = csv.reader(lines, delimiter=";")
        return list(reader)

def main():
    transponders = load_transponders(FILENAME)
    rfid_number = input('Transpondernunmmer ') 

    for row in transponders:
       print (f"Ergebnis 1:{row[0]} Nr1: {row[1]} Nr2: {row[2]} Nr3: {row[3]}")
       if rfid_number == row[0]:
             print(f"Mitarbeiter gefunden: {row[2]}")

if __name__ == '__main__':
    main()
LotharK
User
Beiträge: 51
Registriert: Sonntag 22. März 2015, 10:02

Danke für die Antwort.

aber was macht der Code genau? Der funktioniert einwandfrei, verstehe das aber nicht.

Code: Alles auswählen


def load_transponders1(filename):
    with open(filename, 'r') as lines:
        return [line.split(';') for line in lines]
Gruß Lothar
Sirius3
User
Beiträge: 18254
Registriert: Sonntag 21. Oktober 2012, 17:20

Das in eckigen Klammern nennt sich List-Comprehension. Das kann man in der Dokumentation nachlesen.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1225
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Code: Alles auswählen

return [line.split(';') for line in lines] # <-- list-comprehension
Das ist ähnlich wie:

Code: Alles auswählen

result = [] # <- liste
for line in lines:
    result.append(line.split(";"))
return result # ist eine liste
Die list-comprehension ist gewissermaßen die Liste result.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
LotharK
User
Beiträge: 51
Registriert: Sonntag 22. März 2015, 10:02

Danke für Deine Ausführung.

KR Lothar
Antworten