Seite 1 von 1
Python Datei durchsuchen
Verfasst: Mittwoch 22. April 2020, 13:08
von Neo12345
Hallo ich würde gerne in einer Datei nach exakt dem String suchen. Leider werden mir alle Wörter ausgegeben, die mit dem Wort identisch sind und noch länger sind.
bspw. Wort gesucht "Hallo". Ausgabe: "Hallo, Hallooo". Nur um zu verstehen was gemeint ist.
Wenn ich in der .txt Datei mit folgendem Code suche
var = "Hallo"
with open ("C:\\....") as f:
suche = f.readlines()
if var in line:
zeile = line.split()
print(zeile[2])
Was muss ich ändern, damit ich nur exakt auf den String, den ich haben möchte, zugreife?
Re: Python Datei durchsuchen
Verfasst: Mittwoch 22. April 2020, 13:25
von sparrow
Das, was du schreibst, entspricht nicht dem, was du möchtest.
Du schreibst: Du möchtest exakt nach einer Zeichenkette suchen. Und das tust du auch. Das Programm tut also genau das, was du mit Worten beschreibst.
Du möchtest aber nach einer Zeichenkette suchen, die von bestimmten Zeichen umschlossen ist. Das ist nicht ganz trivial. Auf den ersten Blick könnt man meinen, es reicht den Split vorher durchzuführen und dann zu schauen, ob die gesuchte Zeichenkette eines der Elemente ist. Das funktioniert aber nicht, wenn an Leerzeichen getrennt wird und hinter der Zeichenkette ein Satzzeichen steht.
Ich würde es mit Regulären Ausdrücken lösen. Allerdings ist das ein großes Fass. Hier findest du
Regular Expressions in der Python Dokumentation.
Re: Python Datei durchsuchen
Verfasst: Mittwoch 22. April 2020, 13:33
von Neo12345
Danke für die schnelle Antwort. Ich bin jetzt einen kleinen Umweg gegangen, der nicht ganz das war, nachdem ich gesucht habe, aber für meine Zwecke doch ausreichend war. Ich hab die Länge des Strings berechnen lassen und mit einer Abfrage nur nach diesem Wort gesucht, das auch diese Länge besitzt.
var = "Hallo"
length = len(zeile[2])
if var in lines and length == 5:
.....
Re: Python Datei durchsuchen
Verfasst: Mittwoch 22. April 2020, 13:36
von sparrow
Ist denn das gesuchte Wort immer das 3. Wort in der Zeile?
Re: Python Datei durchsuchen
Verfasst: Mittwoch 22. April 2020, 13:40
von Sirius3
Das, was Du jetzt hast, ist wahrscheinlich in kompliziert:
Code: Alles auswählen
var = "Hallo"
with open ("C:\\....") as lines:
for line in lines:
parts = line.split()
if parts[2] == var:
print(parts[2])
Und noch mehr, falls "Hallo" wo anders vorkommt als an dritter Stelle.
Re: Python Datei durchsuchen
Verfasst: Mittwoch 22. April 2020, 13:51
von Neo12345
@sparrow Ja zum Glück, ist eine Datenbank aus Variablen. Aus der Datenbank benötige ich die Variable und die Adresse der Variablen. Nach denen soll mit dem Programm automatisiert gesucht werden und in ein andere Datei übernommen werden. Da sich die Adressen bei jeder neuen Datenbank ändern und man diese als händisch ändern muss, wollte ich ein kleines Programm schreiben.
@Sirius3 Bin noch relativ neu in Python. Die Datenbank besteht leider nicht durchgängig aus Variablen und deren Adressen. Dein Ansatz scheint mir logisch, bekomme jedoch die Fehlermeldung "list index out of range"
Re: Python Datei durchsuchen
Verfasst: Mittwoch 22. April 2020, 13:53
von Neo12345
@Srius 3 Hab es mit einem Try und Except gelöst, Danke. Funktioniert!
Re: Python Datei durchsuchen
Verfasst: Mittwoch 22. April 2020, 14:26
von Neo12345
Habt ihr noch eine Idee, wie ich die Variable genau der Adresse zuordne? Meine Idee war, nachdem ich den Variablennamen gefunden habe, in einer Schleife über die nächsten Zeilen zu iterieren um nach der nächsten Adresse zu suchen. Die nächste Adresse ist die, die ich brauche. Leider kenne ich keinen Befehl um von...bis zu iterieren, nur über die ganze Datenbank. Gibt's da eine Möglichkeit? Danke schon mal im Vorraus!
Re: Python Datei durchsuchen
Verfasst: Mittwoch 22. April 2020, 14:31
von Sirius3
Das mit den Addressen und nächsten Addressen verstehe ich noch nicht. Kannst Du mal eine paar Beispiel-Zeilen Deiner Daten posten und anhand derer erklären, was Du machen willst?
Re: Python Datei durchsuchen
Verfasst: Mittwoch 22. April 2020, 14:36
von Neo12345
Okay, kann man ein Beispiel der Datenbank zeigen:
/begin MEASUREMENT PLFTALTH "threshold of lat acc"
SWORD _XPDO_CNV_RATFUNC92 1 1 -32768 32767
BYTE_ORDER MSB_FIRST
ECU_ADDRESS 0x3404
ECU_ADDRESS_EXTENSION 0x0
FORMAT "%3.1"
/end MEASUREMENT
/begin MEASUREMENT PLFTALTHBACK "last original threshold of lat. acc."
SWORD _XPDO_CNV_RATFUNC92 1 1 -32768 32767
BYTE_ORDER MSB_FIRST
ECU_ADDRESS 0x17EEA
ECU_ADDRESS_EXTENSION 0x0
FORMAT "%3.1"
/end MEASUREMENT
Die Beschreibung der Variablen befindet sich in einem Block. Der Variablenname ist einzigartig, mit Außnahme, dass ein Teilstring in einer anderen Variable vorhanden ist. (PLFTALTH, PLFTALTHBACK)
Meine Idee war zuerst nach der Variablen zu suchen und ab dann zeilenweise nach dem nächsten Parameter, der Adresse zu suchen, sodass ich der Variablen eine genaue Adresse zuordnen kann.
Bis jetzt konnte ich die noch nicht miteinander verknüpfen. Hoffe das war jetzt einigermaßen verständlich.
Re: Python Datei durchsuchen
Verfasst: Mittwoch 22. April 2020, 14:50
von __blackjack__
@Neo12345: Was genau willst Du denn davon nun haben? Ich würde mich da ja mehr an der Struktur orientieren als einfach nur nach einem Wort zu suchen. Wenn Du "/begin MEASUREMENT PLFTALTH" suchst, dann solltest Du nicht nur ``"PLFTALTH" in line`` testen, sondern ob das tatsächlich auch ein "/begin MEASUREMENT"-Block ist.
Und wenn Du dann einen Wert aus dem Block haben willst, musst Du ja am Ende noch ein bisschen mehr mit der Struktur der Datei machen. Ich würde da wahrscheinlich gleich die Datei ordentlich in eine Datenstruktur parsen. Also mindestens mal den jeweiligen Block in ein Wörterbuch.
Re: Python Datei durchsuchen
Verfasst: Mittwoch 22. April 2020, 15:03
von Neo12345
@blackjack, für das was im Anschluss damit gemacht werden soll, benötige ich den Variablen Namen und die Adresse. Da in der Datenbank noch mehr solcher Blöcke existieren, wollte ich das automatisiert machen, da sich die Datenbank öfters ändert.
Zum zweiten Teil: Ja macht Sinn, aber so komplex wollte ich es an sich nicht machen. Die Datenbank besteht auch leider nicht nur aus den Blöcken. Dann müsste man das ganze noch eingrenzen.
Re: Python Datei durchsuchen
Verfasst: Mittwoch 22. April 2020, 16:19
von Sirius3
Ein simpler Parser, der nur einen Wert liest, ist relativ simple, wenn auch nicht sehr robust, weil er alles, was er nicht kennt, einfach ignoriert. Um einen besseren zu bauen, müßte man die komplette Strukturdefinition kennen:
Code: Alles auswählen
def parse_measurements(filename):
measurements = {}
state = "outside"
with open(filename, encoding="ASCII") as lines:
for line in lines:
if state == "outside":
if line.startswith('/begin MEASUREMENT '):
state = "inside measurement"
measurement_name = line.split(None, 4)[2]
elif state == "inside measurement":
if line.startswith('ECU_ADDRESS '):
address = int(line.split()[1])
measurements[measurement_name] = address
elif line.startswith('/end MEASUREMENT'):
state = "outside"
return measurements
Re: Python Datei durchsuchen
Verfasst: Mittwoch 22. April 2020, 16:42
von Neo12345
@Sirius 3 Danke für die ausführliche Antwort!
Heute werde ich nicht mehr dazu kommen, aber morgen probiere ich mal dein Programm aus.
Ich habe in der Zwischenzeit auch noch ein wenig rumprobiert und bin auf die Lösung gekommen. Vielleicht nicht so elegant aber für die zwei Werte ausreichend.
Code: Alles auswählen
var_1 = "PLFTALTH"
adresse = "ECU_ADDRESS"
liste_1 = []
with open ('filename', 'r') as lines:
for line in lines:
parts = line.split()
try:
if parts[2] == var_1:
liste_1.append(parts[2])
except IndexError:
pass
try:
if parts[0] == adresse:
if liste_1[0] == var_1:
liste_1.append(parts[1])
break
except IndexError:
pass
print("Liste 1: " + str(liste_1))
Re: Python Datei durchsuchen
Verfasst: Mittwoch 22. April 2020, 17:29
von snafu
Im Hinblick auf mögliche Erweiterungen könnte man auch das csv-Modul nutzen. Dabei wird das Quoting beachtet, d.h. Text in Anführungszeichen (wie z.B. am Ende der /begin-Zeilen) bleibt als Ganzes erhalten. Habe mal die Beispiel-Messungen mit eingebunden. Den Teil kann man bei Bedarf löschen und durch die echte Datei ersetzen (StringIO ist eine Art "Fake-Datei").
Code: Alles auswählen
#!/usr/bin/env python3
import csv
# For testing
from io import StringIO
TEST_STREAM = StringIO("""\
/begin MEASUREMENT PLFTALTH "threshold of lat acc"
SWORD _XPDO_CNV_RATFUNC92 1 1 -32768 32767
BYTE_ORDER MSB_FIRST
ECU_ADDRESS 0x3404
ECU_ADDRESS_EXTENSION 0x0
FORMAT "%3.1"
/end MEASUREMENT
/begin MEASUREMENT PLFTALTHBACK "last original threshold of lat. acc."
SWORD _XPDO_CNV_RATFUNC92 1 1 -32768 32767
BYTE_ORDER MSB_FIRST
ECU_ADDRESS 0x17EEA
ECU_ADDRESS_EXTENSION 0x0
FORMAT "%3.1"
/end MEASUREMENT""")
def get_measurement_infos(stream):
result = {}
name = address = None
for row in csv.reader(stream, delimiter=" "):
if not row:
continue
elif row[:2] == ["/begin", "MEASUREMENT"]:
name = row[2]
elif row[0] == "ECU_ADDRESS":
address = row[1]
elif row[:2] == ["/end", "MEASUREMENT"]:
result[name] = address
name = address = None
return result
def test():
TEST_STREAM.seek(0)
print(get_measurement_infos(TEST_STREAM))
if __name__ == "__main__":
test()
Diese expliziten None-Zuweisungen an Name und Adresse sind eigentlich unnötig. Sie zeigen aber Syntax-Fehler in deinen Daten auf. Wenn du also im Ergebnis irgendwo None drin hast, dann stimmt an der Stelle etwas nicht. Alternativ geht auch das Merken bestimmter States, wie es schon gezeigt wurde, mit ordentlichen Fehlerausgaben - wenn man denn soviel Aufwand dafür betreiben möchte.
Interessant für einen Anfänger ist hier bestimmt, dass die Zuweisungen innerhalb der Schleife auch für die weiteren Durchläufe gelten. Das bezieht sich also auf eine übergeordnete Ebene. In Python ist diese Ebene die Funktion selbst, d.h. was in eingerückten Blöcken passiert (auch bei Schleifen) hat immer auch eine Auswirkung auf den umstehenden Namensraum (ist bei manchen Sprachen anders geregelt, also keine Selbstverständlichkeit). Nur außerhalb der Funktion "sieht" man die Variablen wie gesagt nicht.