.txt-Datenbank Suche mit Zeilenausgabe

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Fussel132
User
Beiträge: 23
Registriert: Mittwoch 13. März 2019, 13:55

Hallo Leute,
ich habe eine Frage, und zwar habe ich eine Art Datenbank als .txt-Datei erstellt, die in etwa so aussieht:

Name
Datum
Uhrzeit

Name
Datum
Uhrzeit

usw.

Python soll jetzt in der Datei den Namen suchen, das würde ich dann so machen:

Code: Alles auswählen

from glob import glob

def suche(text, textdatei):
    if text in textdatei:
        print(text) 

filenames = glob("text.txt")
tx="Name"
for filename in filenames:
    f = open(filename)
    suche(tx, f.read()),f.name
    f.close()
und dann den Namen ausgibt, zusammen mit den nächsten beiden Zeilen. Ich habe aber nach einer längeren Internetrecherche kein Ergebnis gefunden, bei dem Python nach einem Namen sucht und dazu noch dessen Zeile mit angibt. Ich stelle mir das im Endeffekt so vor:

Code: Alles auswählen

Linecounter = 0
suche(tx, f.read()),f.name
Linecounter = lineof(tx)
print(Linecounter)
und dann noch Linecounter + 1 und + 2 mit print (nicht mit print aber da weiß ich, wie py eine bestimmte Zeile "printet"

Ich danke euch im Voraus für eure Hilfe und freue mich auf lehrreiche Antworten,
Fussel 132
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast eine Datei mit Struktur, also mußt Du diese Struktur auch einlesen und dann darin nach dem Namen suchen. Du hättest Glück, weil Uhrzeiten selten wie Namen sind, aber wenn es noch die Addresse oder ähnliches in den Daten stehen würden, käme es zu Durchmischungen; trotzdem ist dein jetziges Vorgehen nicht gut.
Deshalb, die Datei Zeilenweise lesen, immer drei Zeilen zu einem Datensatz zusammenfassen, auf die Leerzeile prüfen und dann in diesen Daten nach dem Namen suchen.

Ein Dateiformat, das aus mehreren zusammengehörigen Zeilen besteht ist relativ schwierig zu lesen. Besser wäre es, wenn ein Datensatz genau in einer Zeile steht, also »Datum, Uhrzeit, Name«. Sowas nennt sich dann csv-Datei und dafür gibt es schon ein fertiges Modul zum Lesen und Schreiben.
Fussel132
User
Beiträge: 23
Registriert: Mittwoch 13. März 2019, 13:55

Ich probier mein Glück mal mit csv, aber danke!
Fussel132
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Fussel132: Die Verwendung von `glob()` im gezeigten Quelltext ist total unsinnig.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Fussel132
User
Beiträge: 23
Registriert: Mittwoch 13. März 2019, 13:55

OK Habs jetzt mit csv gemacht, @__blackjack__, nach längerem Nachdenken ist mir das auch aufgefallen. Ich nutze jetzt das csv-Modul und csv.reader, aber ich bekomme trotzdem nicht heraus, wie ich wenn in row 3 der gesuchte Name steht, das dann die gesamte row 3 ausgegeben wird. Kann man sich bei csv denn die entsprechende 'row' anzeigen lassen (in diesem Beispiel die 3te)? Danke im Voraus,
Fussel132
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Fussel132: Wieso bekommst Du das nicht heraus? Zu dem Zeitpunkt wo Du den Namen gefunden hast, musst Du doch den gesamten Datensatz haben, denn aus dem hast Du ja den Namen zum Vergleichen genommen. Und wenn Du den gesamten Datensatz hast, kannst Du ihn auch einfach ausgeben. Wo liegt da das Problem? Zeig doch mal Deinen Quelltext mit dem Du nach dem Namen suchst.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Fussel132
User
Beiträge: 23
Registriert: Mittwoch 13. März 2019, 13:55

Klingt nach einer doofen Frage, aber csv has no attribute writer???

EDIT: Irgendwie schmiert immer entweder Python oder mein PC ab, ich bekomme auch immer die Meldung, wenn ich die Datei direkt im Editor starte und Dan ausführen will, kann IDLE keinen subprozess starten. Wenn irgendjemand dafür eine Lösung hat, cool. Ich benutze Win10 nebenbei.
Fussel132
User
Beiträge: 23
Registriert: Mittwoch 13. März 2019, 13:55

Das ist der Quelltext:

Code: Alles auswählen

csvfile = open('text.csv', "rb")
reader = csv.reader(csvfile, delimiter=';')
for row in reader:
    if "WertC" in row:
        print ' '.join(row)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Und was ist jetzt die genaue Fehlermeldung?
Du suchst ja immer noch den Namen in allen Feldern, statt nur im Namensfeld.
Fussel132
User
Beiträge: 23
Registriert: Mittwoch 13. März 2019, 13:55

Ich hab meinen PC rebootet und jetzt funktioniert es tadellos. Wird mal Zeit für nen neuen. Vielen Dank!
Fussel132
Antworten