Entwurf von Tool, das bestimmte Teile aus Listen ausliest

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
trbo
User
Beiträge: 10
Registriert: Mittwoch 29. April 2015, 08:48

Liebe Python-Spezialisten,

im Rahmen einer mir zugeteilten Aufgabe, bei der ich bestimmte Passagen aus einer sehr langen Liste auslesen muss um diese in eine Datenbank zu überführen stehe ich momentan vor dem Problem dafür ein geeignetes Python Tool zu entwerfen.

Die Liste wird von einem (bereits fetiggestellten und überprüften Tool ausgelesen und übergeben). Meine Aufgabe ist es nun aus dieser Liste (die auch zahlreiche irrelevante Informationen sowie ganze Zeilen) folgende Daten auszulesen

Code (8.Stellen), Erkannt (0/1) sowie die dazugehörige Zeit

Dies soll so lange durchgeführt werden bis die Liste komplett durchlaufen ist.

Da ich mit Python zuvor noch nie in Berührung gekommen bin habe ich im Moment noch große Schwierigkeiten, habe jedoch bis jetzt folgendes ausgearbeitet und hoffe mir kann hier jemand helfen.

(#hier erkläre ich was an der jeweiligen Stelle passiere sollte)

Code: Alles auswählen

daten+ = fp.readlines()

while n < len(daten): 

def  erkannt():
         for line in fp.readlines(): 
	    if line.find(‘’D:’’) != -1:
	    for (‘’D:1’’)
		return True 
	else  return false 
# boolean ob erkannt oder nicht / D:1 ist der Eintrag der besagt das es erkannt wurde D:0 demzufolge nicht erkannt

Code: Alles auswählen

def Code(market):
    
     lines = fp.readlines()
     fp.close()
     idx = 0
     idx_start = 0
     idx_end = 0
	if line.find(‘’Code: ’’) !=-1 : idx_start = idx + 1
		return digits
		idx = idx +1
	elif line.find (‘’:’’)
		break 
# hier liegt ein Code vor, der in der Liste bei ''Code:'' beginnt und beim nächsten '';'' endet

Code: Alles auswählen

def  time (???):
t= time.time()
‘{%H;%M;%S}’.format(t)
	if line.find(t)
		return t

# in jeder Zeile in der die anderen beiden Werte auftauchen taucht auch die Zeit auf, welche den anderen beiden Werten zugeordnet werden soll



Eine beispielhafte Zeile sieht so aus (Dinge die ich auslesen will sind unterstrichen)

30.05.2015 08:15:27 UNIQUE_ID; RESULT: 8593425346234534 ; PRICE : 46 ; CATEGORY : 77 ; CODE : 44886621 ; D:1 ; FILE: 1502.jpg;


Ich hoffe mir kann jemand weiterhelfen und danke euch vielmals im Vorraus

Mfg

trbo
Zuletzt geändert von trbo am Mittwoch 29. April 2015, 10:53, insgesamt 2-mal geändert.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@trbo: das was Du gepostet hast ist kein Python und so durcheinander, dass es nicht zu lesen ist. Im Forum gibt es für Code spezielle Tags [python], damit werden auch Einrückungen dargestellt, ohne die Python-Code nicht lesbar ist. Ich sehe an drei Stellen readlines. Das heißt Du liest drei mal die komplette Datei?

Die Datei scheint ja irgendeinem Format zu entsprechen. Der erste Schritt wäre also, eine Zeile in eine interne Datenstruktur zu überführen. Ein Dictionary würde sich anbieten. Ich denke mal, der Tag ist genauso wichtig wie die Uhrzeit, nicht dass mal was über Nacht aufgenommen wird.

Da das erste Feld in der Zeile keinen Feldnamen hat, habe ich es einfach mal timestamp genannt. Generell könnte das dann so aussehen:

Code: Alles auswählen

def parse_line(line):
    """wandelt eine Zeile in ein Woerterbuch um"""

def write_data(timestamp, code):
    """schreibt die Daten in die Datenbank"""

def main():
    with open("input_filename") as lines:
        for line in lines:
            data = parse_line(line)
            if data['D'] == 1:
                write_data(data['timestamp'], data['CODE'])

if __name__ == '__main__':
    main()
Zuletzt geändert von Sirius3 am Mittwoch 29. April 2015, 10:36, insgesamt 1-mal geändert.
BlackJack

@trbo: Nicht eingerückter Quelltext bei einer Sprache wo Einrückung essentieller Bestandteil der Syntax ist, macht als Beispiel nicht viel Sinn. Und die typografischen Anführungszeichen sind auch sehr seltsam und syntaktisch falsch. Hast Du das etwa mit einer Textverarbeitung geschrieben?

Du musst das Problem auf Teilprobleme herunterbrechen die einfach zu lösen sind. Falls nötig auch die Teilprobleme solange weiter zerlegen bis sie durch eine einfache Funktion lösbar sind. Die Teillösungen testest Du jeweils und setzt sie dann zur nächstgrösseren Teillösung zusammen solange bis eine Gesamtlösung steht.

Erster Ansatz wenn man etwas für viele ”Dinge” lösen soll ist es das erst einmal für ein ”Ding” zu lösen. Denn dann kann man die Lösung für ein ”Ding” in einer Schleife für jedes der vielen ”Dinge” aufrufen. Die Dinge sind hier Zeilen. Wenn man eine Funktion schreibt welche die gewünschten Daten aus *einer* Zeile extrahiert, dann kann man die nacheinander auf jede Zeile anwenden und die Ergebnisse sammeln. Zum Beispiel in einer Liste. Dann braucht man noch nicht einmal eine Schleife selber schreiben, sondern kann die Funktion für eine Zeile mit `map()` auf alle Zeilen anwenden.

Statt mit `find()` und Indexen zu arbeiten wäre es auch sinnvoller sich an der Struktur der Zeilen zu orientieren. Also beispielsweise zweimal an Leerzeichen zu splitten, dann hat man Datum, Uhrzeit, und die Daten separat. Die Daten wiederum scheinen aus durch Doppelpunkten getrennten Schlüssel/Wert-Paaren zu bestehen die jeweils durch Semikolons abgegrenzt sind. (UNIQUE_ID scheint aus diesem Muster heraus zu fallen, oder ist das ein Fehler in dem Beispieldatensatz‽). Diese Schlüssel/Wert-Paare lassen sich in ein Wörterbuch (`dict`-Typ in Python) überführen. Eventuell sollte man in dem Schritt die Schlüssel komplett in Klein- oder in Grossbuchstaben umwandeln, denn Du bist da nicht wirklich konsistent was die Schreibweise angeht. Falls die Daten allerdings konsistent sind, dann solltest Du das in Deinem Code auch sein.
trbo
User
Beiträge: 10
Registriert: Mittwoch 29. April 2015, 08:48

Sorry, wusste das mit den tags für Code nicht, habe es angepasst.

@Sirius 3: bei dem was du gepostet hast verstehe ich nicht ganz wie genau jetzt nur die relevanten Datensätze identifiziert werden. Ich dachte mir man müsse das Skript so gestalten, dass es die Dinge einzeln erkennt und ausließt, sorry wenn ich etwas auf dem Schlauch stehe.

@BlackJack: Ja das mit dem : hinter UNIQUE_ID ist ein Tippfehler, hier gehör auch ein '';'' hin. Bei dem Splitten könnte ggf. ein Problem auftreten, da es in den Daten auch Zeilen gibt die absolut aus dem Muster herausfallen, deshalb dachte ich mir das ganze mit einer Schleife zu lösen, die nur betreten wird sofern eine der 3 relevanten Daten gefunden wird.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@trbo: wie ist denn der Code in Deinen Post gekommen? Welchen Text-Editor verwendest Du da?

Wie BlackJack schon geschrieben hat, mußt Du Dein Problem in kleine unabhängige Teile aufspalten. Dein jetziger Ansatz ist es, eine Zeile als String immer wieder zu durchsuchen. Das macht das Testen und Warten, falls sich am Zeilenformat mal etwas ändert, sehr schwierig. Das erste Teilproblem, das Du lösen solltest, ist es also, die Zeile in ein Wörterbuch zu verwandeln:
1. Das Datum abspalten
2. An den ';' die Zeile aufspalten
3. Jedes Feld in Schlüssel und Wert am ':' trennen
Später kannst Du dann das Wörterbuch benutzen, um zu Prüfen, ob D und CODE in der Zeile enthalten waren und welche Werte sie haben.
BlackJack

@trbo: Und wenn eine Zeile nicht dem Muster entspricht wird es bei einem der Schritte zum Verarbeiten einer Zeile ein Problem geben, in welchem Fall man die Zeile dann einfach als nicht relevant betrachtet. Man könnte dann entweder eine dedizierte Ausnahme auslösen und die explizit beim Aufrufer ignorieren, oder beispielsweise ein leeres Wörterbuch als Ergebnis liefern, wo die entsprechenden Tests auf die gesuchten Schlüssel dann natürlich negativ ausfallen.
trbo
User
Beiträge: 10
Registriert: Mittwoch 29. April 2015, 08:48

Vielen Dank zuerst mal für die vielen hilfreichen Beiträge

Ich hab mich jetzt mal an den Tipps versucht und folgenden ''Rohentwurf'' erarbeitet, hoffe das es kein allzugroßer nonsens ist

Code: Alles auswählen

daten+ = fp.readlines
 def parse_line(daten):
def main():
 with open (daten) as lines:
  for line in lines:
   daten = l.split('';'')
'' hier wusste ich nicht weiter wie ich am besten das Datum abspalte, da es nich benötigt wird und die Zeit ausgebe oder zwischenspeicher, kommt noch dazu sobald mir etwas eingefallen ist''

Code: Alles auswählen


if item.find('D') !=-1;
 r.strip('':'')
if find (''Code'')
 r.strip('':'')
''hier fehlt auch noch die Ausgabe der r.strip Befehl ignoriert wenn ich es richtig verstanden habe den linken Teil und gibt den rechts vom ':' weiter''
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

trbo hat geschrieben:Vielen Dank zuerst mal für die vielen hilfreichen Beiträge
Du solltest auch kleine Codestücke zumindest einmal ausprobieren. Aktuell schreibst du syntaktischen Murks hin.

Nur als Beispiel.

Code: Alles auswählen

>>> l = ""
>>> daten = l.split('';'')
SyntaxError: invalid syntax
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@trbo: nochmals meine Warnung: ich halte es für einen Fehler das Datum zu ignorieren. Zumal es weder in Python noch in irgendeiner Datenbank einen Mehraufwand verursacht.

Mit welchem Tutorial oder Buch arbeitest Du eigentlich, um Python zu lernen? Einrückungen sollten immer 4 Leerzeichen sein. Jeder Texteditor läßt sich so einstellen, dass die Tab-Taste 4 Leerzeichen einfügt. Hast Du Dir schonmal angeschaut, was in daten steht? Jedes Element dieser Liste kannst Du wieder mit split in zwei Teile vor und hinter dem Doppelpunkt teilen.
BlackJack

@trbo: Der ”Rohentwurf” hat nie einen Python-Interpreter gesehen, beziehungsweise scheitert der schon am Compiler. Programme werden nicht auf Papier oder in einem Editor entwickelt ohne tatsächlich ausgeführt zu werden. Wenn Du hier etwas zeigst dann sollte das mindestens den Compiler ”überstehen” und soweit wie möglich lauffähig sein. Denn sonst müssen wir Dir hier Sachen erzählen die Du ganz einfach selbst herausgefunden hättest und Compiler-Fehlermeldungen möchte Dir hier sicherlich niemand auf Dauer erzählen.
trbo
User
Beiträge: 10
Registriert: Mittwoch 29. April 2015, 08:48

Code: Alles auswählen

myFile = open('daten.txt')

jrn = myFile.read()

jrn2 = jrn.split(';')
a = jrn2[0]
time = a.split()

code = jrn2[6]
ean = code.split(': ')

if 'SMR: 1' in jrn :
    print ('gelesen')

else:
    print ('nicht gelesen')


print (('Uhrzeit= ' + time[1]+ '  CODE: '+code[1]))
Habe diesen Code jetzt im Interpreter und er funktioniert und gibt mir die die werte wie folgt aus


gelesen
Uhrzeit= 08:15:27 CODE: 44886621


ich weis es ist jetzt noch keine elegante lösung aber wenigstens schonmal etwas das funktioniert. ich werde jetzt noch versuchen uhrzeit und CODE über Suchoperatoren rauszufiltern, sowie eine Bedingung einfügen die überprüft ob es sich um eine Zeile mit Informationen oder eine der irrelevanten Zeilen handelt
Antworten