Seite 1 von 1
					
				Altes Textdateiproblem...
				Verfasst: Freitag 28. Oktober 2016, 20:36
				von T-User
				Hallo Leute,
möchte mir aus Not etwas stricken... 

 Im Grunde gibt es eine Textdatei z.B.
asd
741258
abd
741259
abc
741260
Ich suche zuerst nach "abc" in der Datei und das klappt mit dem folgenden Code:
Code: Alles auswählen
def suche():
    with open("Datenbankliste.txt", "r") as eingabe:
        x = "abc"
        for line in eingabe:
            if x in line:
                print ("Gefunden")
                break
            else:
                print ("Fehler")
    return()
suche()
Mein Problem ist, wenn ich z.B. die Zeile mit abc gefunden habe möchte ich als Rückgabewert
die Zahl 741260 als Wert auslesen? Hat jemand das Lösungsansatz für mich?
 
			
					
				Re: Altes Textdateiproblem...
				Verfasst: Freitag 28. Oktober 2016, 21:01
				von Sirius3
				@T-User: Du liest einfach die nächste Zeile ein und gibst sie statt des leeren Tupels zurück.
			 
			
					
				Re: Altes Textdateiproblem...
				Verfasst: Freitag 28. Oktober 2016, 21:11
				von T-User
				Hallo Sirius,
genau da fehlt mir ein kleines Stück von Puzzle 

 Ich komme einfach
nicht drauf. Wie kann ich die nächste Zeile lesen? Das Programm denkt ja
ich habe gefunden was du von mir verlangt hast und ist im Prinzip beendet.
 
			
					
				Re: Altes Textdateiproblem...
				Verfasst: Freitag 28. Oktober 2016, 21:27
				von Sirius3
				@T-User: am einfachsten per "return next(eingabe)", oder
Code: Alles auswählen
from itertools import dropwhile
def suche(search):
    with open("Datenbankliste.txt", "r") as eingabe:
        next(itertools.dropwhile(lambda line:  search not in line, eingabe))
        return next(eingabe)
print(suche("abc"))
 
			
					
				Re: Altes Textdateiproblem...
				Verfasst: Freitag 28. Oktober 2016, 21:27
				von pixewakb
				Trenn mal Daten und Logik, d. h. übergib deinen Suchstring mittels Parameter an die Funktion und ziehe deine Daten auch nicht erst in der Funktion. Ich habe mit solchen Problemen häufiger zu tun und setze dann immer eine flag (Flagge). Habe ich es gefunden, dann geht die Flagge auf True, d. h. beim nächsten Durchgang (nächste Zeile(n)) wird etwas mit den folgenden Daten gemacht. Habe ich alles erledigt, geht die Flagge wieder auf False und die Daten rauschen durch. Ich hoffe der Quellcode ist lesbar:
Code: Alles auswählen
w = """asd
741258
abd
741259
abc
741260"""
w = w.split("\n")
# w = []
# with open("Datenbankliste.txt", "r") as eingabe:
#     for line in eingabe:
#         w.append(line.strip("\n")
def suche(eingabe, suchwort):
    flag = False
    result = []
    for line in eingabe:
        if flag == True:
            result.append(line)
            flag = False
        if suchwort in line:
            print ("Gefunden")
            flag = True
        else:
            print ("Fehler")
    return result
suchwort = "abc"
result = suche(w, suchwort)
print("**" * 8)
print(result)
 
			
					
				Re: Altes Textdateiproblem...
				Verfasst: Samstag 29. Oktober 2016, 07:45
				von T-User
				Morgen Leute,
vielen Dank für die Tipps! Die Lösung ist wirklich
genial wie einfach. Mit return next ist das Problem gelöst.
Ich bitte um Verständnis, dass ich den Code so einfach wie möglich 
halten möchte. Denn ich möchte ihn auch nachvollziehen können.
Allerdings habe ich noch eine Frage. Gibt es eine Möglichkeit die Suche an 
der Stelle wieder fortzuführen? Es kann bei meiner Textdatei folgendes passieren:
asd
741258
abd
741259
abc
741260 ("Erste abc gefunden, gebe den Wert 741260 zurück und suche nach abc weiter")
abf
741261
abc ("Weiterer abc-Wert gefunden, gebe den Wert 741262 zurück")
741262
Code: Alles auswählen
def suche():
    with open("Datenbankliste.txt", "r") as eingabe:
        x = "abc"
        for line in eingabe:
            print (line)
            if x in line:
                print ("Gefunden")
                return next(eingabe)
            else:
                continue
    return()
print (suche())
 
			
					
				Re: Altes Textdateiproblem...
				Verfasst: Samstag 29. Oktober 2016, 09:12
				von Sirius3
				@T-User: Warum gibst Du, wenn kein Treffer gefunden wurde ein leeres Tuple zurück? Das macht keinen Sinn. Entweder Du gibst explizit None zurück oder wirst eine Ausnahme. Und was soll denn dieses "else: continue" bewirken? pixewakb hat Dir ja schon eine Möglichkeit gezeigt, wie man statt der Zeile gleich eine Liste aller Zeilen zurückgeben kann. Besser ist es, statt einer Funktion einen Generator zu schreiben, dann kann man selbst entscheiden, wie man mit den Ergebnissen weiterarbeiten will:
Code: Alles auswählen
DATENBANKDATEI = "Datenbankliste.txt"
def suchen(suchwort):
    with open(DATENBANKDATEI, "r") as eingabe:
        for zeile in eingabe:
            if suchwort in zeile:
                yield next(eingabe)
 
print(list(suchen("abc")))
 
			
					
				Re: Altes Textdateiproblem...
				Verfasst: Samstag 29. Oktober 2016, 12:07
				von pixewakb
				
hatte ich gar nicht mehr auf dem Schirm. Cool!
 
			
					
				Re: Altes Textdateiproblem...
				Verfasst: Samstag 29. Oktober 2016, 15:44
				von T-User
				yeep!!!!!
Danke Euch!!! yield next(eingabe) beste Lösung für mich. Einfach und super.
@Sirius - hast recht vieles habe raus geschmießen weil unnötig. Danke Dir!