Textstring suchen! aber wie?

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.
Malibow
User
Beiträge: 8
Registriert: Donnerstag 30. Oktober 2008, 12:00

Dienstag 4. November 2008, 10:37

Hallo an alle Pythonuser und Freunde,
habe ein Problem und zwar...

habe 2 Listen von Tupeln!
Liste A: enthält ['0x016', '0x033' ...]
Liste B: enthält ['0x016=blablabla', '0x017=text']

Liste A ist vorgegeben und Liste B wird aus einer Datei erzeugt.

Ich möchte jetzt überprüfen ob die Elemente Aus Liste A in Liste B vorzufinden sind.
Falls ja möchte ich Das gleiche Element samt Text Ausgeben.
Habt ihr ne einfache Idee wie ich da rangehen könnte?
gibts ne entsprechende Suchfunktion in Python?
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Dienstag 4. November 2008, 10:43

Hast du Einfluss darauf, wie die Listen erstellt werden?

Wenn ja, dann mach aus Liste B ein Dictionary, das dann etwa so aussieht:

Code: Alles auswählen

listeB = {'0x016' : 'blablabla', '0x017' : 'text', ... }
dann kannst du einfach über den Schlüssel auf die Werte zugreifen:

Code: Alles auswählen

for i in listeA:
    if listeB.has_key(i):
        print listeB[i]
    else:
        print "Wert %s nicht in Liste B" % i
...so in etwa
Malibow
User
Beiträge: 8
Registriert: Donnerstag 30. Oktober 2008, 12:00

Dienstag 4. November 2008, 10:52

ähm ja habe Einfluss darauf...
Liste B wird aus einer Textdatei erstellt die zuvor nur über Zeilen getrennt war.. mal schauen ob ich das hinbekomm ;-)

ging ja brutal schnell die Antwort danke erstmal
Malibow
User
Beiträge: 8
Registriert: Donnerstag 30. Oktober 2008, 12:00

Dienstag 4. November 2008, 12:20

hat mir noch jemand nen tipp wie ich des dictionary aus der Textdatei am einfachsten erstelle?

Zur info
Textdatei ist wie folgt aufgebaut
0x016=blablabla
0x017=text
.
.
.
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Dienstag 4. November 2008, 12:33

du wolltest doch schauen ob du das hin bekommst, wo sind denn deine Ansätze? :wink:

Und wo hast du Probleme?

Das öffnen der Datei wirst du ja hinbekommen, oder?
Dann nimmst du einfach jede Zeile, wie vorher auch schon, aber packst die nicht so in eine Liste, sondern splittest sie an dem "=" und fügst dem Dictionary ein neues Element hinzu. Der Key ist dann das was vor dem "=" steht, und das Value das dahinter.

Aber ich frage ich grade, werden die Einträge, die nicht in Liste A sind, überhaupt später noch benötigt? Wenn nicht, könntest du direkt beim einlesen mit "if wert in listeA:" filtern... nur so als Gedanke...
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Dienstag 4. November 2008, 13:09

Na gut... :)

Natürlich könnte man hier auch mit csv arbeiten, obwohl sich die Frage stellt ob das sinnvoll wäre:

Code: Alles auswählen

import csv
csv.register_dialect('bla', delimiter='=', quoting=csv.QUOTE_NONE)
raw_data = csv.reader(open("dateiname.tx", "rb"), 'bla')
data = {}
for row in raw_data:
    data[row[0]]=row[1]
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Dienstag 4. November 2008, 13:19

Ohne den Gebrauch von csv sähe das etwa so aus:

Code: Alles auswählen

data = {}
f = file('dateiname.txt', 'r')

for line in f.readlines():
    d = line.split('=')
    data[d[0]]=d[1].strip()
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Dienstag 4. November 2008, 13:49

Etwas einfacher:

Code: Alles auswählen

f = file('dateiname.txt', 'r')
data = dict(line.strip().split('=') for line in f)
f.close()
MfG
HWK
BlackJack

Dienstag 4. November 2008, 13:53

@.robert: `readlines()` liesst die gesamte Datei auf einen Schlag in den Speicher, das ist hier nicht nötig. Ausserdem sollte man die Datei auch wieder schliessen.

Code: Alles auswählen

f = open('dateiname.txt', 'r')
data = dict(line.rstrip().split('=', 1) for line in f)
f.close()
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Dienstag 4. November 2008, 13:57

Danke für die Verbesserung, an das schließen hatte ich jetzt wirklich nicht gedacht :)
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Dienstag 4. November 2008, 14:02

@BlackJack: split('=', 1) ist natürlich sicherer. Ich würde aber lieber strip als rstrip verwenden, da führende Whitespaces in einem Key wohl nicht so sinnvoll sind.
MfG
HWK
Malibow
User
Beiträge: 8
Registriert: Donnerstag 30. Oktober 2008, 12:00

Dienstag 4. November 2008, 14:51

Code: Alles auswählen

def ausgeben(listeA):
      try:
            datei = file("text.txt")
            fehlercodes = datei.readlines()
            datei.close()
      except:
            print "Kann Datei nicht oeffnen!"
      listeB={}
      for eintrag in fehlercodes:
            l_eintrag = eintrag.split("=")
            listeB[l_eintrag[0]] = l_eintrag [1:]

      hilfsliste=[]
      for i in listeA: 
          if listeB.has_key(i):
                hilfsliste.append(i+ str(listeB[i]))

          else: 
              print "Wert %s nicht in der Fehlerliste " % i
      return hilfsliste

hab jetzt mal des so zusammengebastelt!

scheint hier ja ne Menge los zu sein im Forum......

danke allen Mithelfenden!

jetzt gibts noch ein Problem und zwar fehlen in ListeA die führenden Nullen der Hexzahlen d.h. dass er mir jedesmal die Meldung bringt dass 0x15 aus Liste A nicht in Liste B 0x00015 vorhanden ist:

wie könnte ich die eliminieren?


@Blackjack warum sollte ich nicht die ganze Datei einlesen sind ca 100 Zeilen
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Dienstag 4. November 2008, 15:12

Wandele die Hexzahlen in Ints mit int(zahl, 16) um.
Übrigens: Deine Funktion wird crashen, wenn Du die Datei nicht öffnen kannst, da dann fehlercodes nicht definiert ist. Du solltest also den Fehler nicht nur ausgeben, sondern auch darauf reagieren. Außerdem solltest Du nur bestimmte Exceptions abfangen, z.B. mit

Code: Alles auswählen

except IOError:
MfG
HWK
sevven
User
Beiträge: 1
Registriert: Montag 27. Oktober 2008, 00:13
Wohnort: London

Dienstag 4. November 2008, 15:43

bin zwar noch lange kein profi, aber hier mal meine ansicht dazu. Umgeht das extra umspeichern nach dem einlesen und der vorschlag vom Bild is auch dabei.
ungetestet:

Code: Alles auswählen

def ausgeben(listeA):
      try:
            datei = open("text.txt","r")
      except IOError:
            print "Kann Datei nicht oeffnen!"
      
      listeB=[]
      while 1:
            line = datei.readline().strip()
            if not line: # equal to 'end of file'
                  break
            else:
                  if (line.split("=")[0]) in listeA:
                        print "%s ist in Liste!" % line
                        listeB.append(line)
                  else:
                        print "%s ist nicht in Liste" % line
      datei.close()
      return listeB
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Dienstag 4. November 2008, 16:00

@sevven:

Die while-Konstruktion zum Auslesen der Datei ist nicht "python-like". Das geht in Python VIEL eleganter:

Code: Alles auswählen

for zeile in datei:
    # mach was mit zeile
Es wird einfach über alle Zeilen der Datei iteriert, das Zeilenende brauchst du gar nicht explizit zu prüfen.
Antworten