Wiederaufnahme von Suche innerhalb Liste

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
Benutzeravatar
Gunnar
User
Beiträge: 68
Registriert: Samstag 23. Oktober 2004, 08:59

Moin !
Ich suche innerhalb einer Datei nach passenden Einträgen und möchte diese verändern und in Datei_neu ablegen.

Nun ist es so, daß die Datei auch viele Einträge enthält, die ich nicht brauche. Sprich ich muß mir Funktionen bauen, die das für mich machen.

Hier seht ihr mal einen Auszug aus einer Beispielldatei :

042 BL V C 00:00:00:00 00:00:01:13 01:03:31:09 01:03:32:22
004 WARNERLO V C 19:38:02:12 19:38:16:05 00:59:59:05 01:00:12:23
* FROM CLIP NAME: WARNER LOGO PICTURE
095 101 V C 01:01:58:21 01:02:10:04 01:06:07:04 01:06:18:12
* FROM CLIP NAME: 5B/2/2
012 101 V C 01:07:35:01 01:07:36:21 01:06:18:12 01:06:20:07

Ziel : - Zeile 4 finden, bearbeiten
- danach Zeile 6 finden, bearbeiten
- usw...( könnte dann auch Zeile 9 sein z.B. also keine Regelmäßigkeit )

Mein aktueller Stand ist :
- jede Zeile in eine Liste einlesen ( organisiert in einer Großen )

Code: Alles auswählen

f = file (old_edl_path, "r")
    old_edl_list = [z.rstrip().split() for z in f][:]
Meine aktuelle Überlegung :
- über die Listen iterieren und die erste Liste bearbeiten, die 2mal eine dreistellige Zahl beinhaltet
- dann würde ich gerne die Suche dort fortsetzen, wo eben ein Eintrag gefunden wurde


Fällt euch etwas dazu ein ?

Danke im voraus,
Gunnar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Gunnar,

entweder mit einem Iterator, der nacheinander jede Zeile zurückgibt die am Beginn zwei dreistellige Zahlen enthält.
Oder gleich mit einem Filter in der LC

Iterator:

Code: Alles auswählen

def next_match(old_edl):
    for x in old_edl:
        if len(x[0]) == len(x[1]) == 3 and x[0].isdigit() and x[1].isdigit():
            yield x
 
f = file (old_edl_path, "r")
old_edl_list = [z.rstrip().split() for z in f]
for match in next_match(old_edl_list):
    print match # oder mach sonstwas
LC:

Code: Alles auswählen

f = file (old_edl_path, "r")
tmp = [z.rstrip().split() for z in f]
old_edl_list = [x for x in tmp if (len(x[0]) == len(x[1]) == 3 and
                                   x[0].isdigit() and x[1].isdigit())]
for match in old_edl_list:
    print match # oder mach sonstwas
Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Benutzeravatar
Gunnar
User
Beiträge: 68
Registriert: Samstag 23. Oktober 2004, 08:59

Danke für die schnelle Antwort Dookie !

Da aber manche Zeilen die Bedingungen nicht erfüllen, ich sie aber trotzdem am Ende wieder in eine neue Datei zurückschreiben muss, stellt sich mir ein Problem.

Zur Zeit weiß ich einfach nicht mehr weiter...aber soo schwer kann es ja garnicht sein. Ich wollte das Ganze jetzt mit einer Ausnahme regeln, damit ich nach einem Fehler ( hier ein provozierter Indexerror in der Beispielliste ) weitermachen kann. Wisst ihr wie das geht ?

Hier ist ein Auszug aus dem Script, ist etwas laienhaft geschrieben, aber ich bin ja noch Anfänger. ;0)

Code: Alles auswählen

class convert:
    
    def read_list(split_ch=" "):
        old_edl_path =  startoptions.options.filename
        f = file (old_edl_path, "r")
        old_edl = []
        for line in f:
            record = line.strip().split(split_ch)
            old_edl.append(record)
        return old_edl
    
    def next_match(edl):
        for x in edl:
            if len(x[0]) == len(x[2]) == 3 and x[0].isdigit() and x[2].isdigit():
                yield x

    old_edl = [['001','','003'],['004','','006'],['007','008'],['009','','011']] #Hiermit umgehe ich nur die eigentliche Liste
    #old_edl = read_list()
    #print old_edl

    while True:
        try:
            for x in next_match(old_edl):
                print x #Hier soll der aktuelle Eintrag aus der Liste bearbeitet werden
        except IndexError:
            print "failed"
            break

Danke Gunnar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

hmm mal wieder das alte Problem, je genauer deine Problembeschreibung um so einfacher kann man eine Lösung finden.

Code: Alles auswählen

old_edl_list = [z.rstrip().split() for z in f]
new_edl_list = []
for x in old_edl_list:
    if len(x[0]) == len(x[1]) == 3 and x[0].isdigit() and x[1].isdigit():
        #liste bearbeiten
        new = foo_bar(x) # eintrag bearbeiten
        new_edl_list.append(new)
    else:
        new_edl_list.append(x) # was anderes machen oder gar nix
# hier kannst dann new_edl_list speichern oder sonstwas machen
Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Antworten