[String] Alle Wörter zurückliefern die "xxx" entha

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
Corni
User
Beiträge: 4
Registriert: Donnerstag 29. März 2007, 09:51

Hallo zusammen,

durch einen Fehler beim Backuppen der Datenbank eines Projektes sind die MySQL-Dumbs verloren gegangen und somit auch die ganzen Tabellendefinitionen.
Um an diese wieder heranzukommen will ich mit Python alle *.php-files auslesen und alle Wörter ausgeben/ speichern die "SdTa" enthalten (so beginnen die Tabellen). Da wir niemals SELECT * verwendet haben, sollte die Datenstruktur grob wieder hergestellt werden können auch wenn Längenangaben und PrimeryKeys neu angegeben werden müssen.
Weiß jemand eine gute Möglichkeit, wie ich beim einlesen einer Datei das am besten realisieren könnte?
hobbes_dmS
User
Beiträge: 11
Registriert: Mittwoch 18. April 2007, 13:15

Code: Alles auswählen

import os

def checkfile(filename, searchstring):
    #checkt eine Datei auf das Vorkommen eines Wortes
    fi = file(filename, 'r')
    li = []
    for line in fi:
        parts = line.split()
        for word in parts:
            if word.find(searchstring)!= -1:
                li.append((word))
    return li


def checkfiles(path, extension, searchstring):
    #geht alle dateien im Verzeichnis "path" durch, die die Endung
    #"extension" haben, und gibt sie an die Funktion "checkfile" weiter
    files = os.listdir(path)
    li = []
    for fi in files:
        if os.path.isfile(fi):
            pos = fi.find(extension)
            if (pos != -1) & (pos == (len(fi)-3)):
                li2 = checkfile(fi, searchstring)
                if li2 != []:
                    li.append( ((fi), (li2)))
    return li

li = checkfiles(".", "php", "SdTa")
for entry in li:
    print entry
so? das gibt die worte aus, die "stda" enthalten und in Dateien mit der Endung "php" enthalten sind.
willst du nur die "worte" oder immer die ganze Zeile?
jabber-id: hobbes@mi-wgnetz.de
BlackJack

Du magst Klammern, oder? ;-) In den Zeilen 11 und 26 sind ein paar überflüssige.

Die Beschränkung von Variablennamen auf zwei Zeichen kenne ich noch vom BASIC auf dem C64 ─ bei Python darf man auch längere verwenden. ;-)

Die Logik von `checkfile()` erschliesst sich mir nicht so ganz. Du suchst die Worte aus der Zeile in der Suchzeichenkette statt die den Suchbegriff in der Zeile!? Desweiteren ist `str.find()` nur nötig wenn man nicht nur wissen möchte *ob* eine Zeichenkette in einer anderen enthalten ist, sondern auch *wo*. Für einen einfachen "enthalten sein"-Test genügt der ``in``-Operator. Ausserdem sollte man Dateien auch wieder schliessen.

Ob eine Zeichenkette mit einer anderen endet, testet man am einfachsten mit der `endswith()`-Methode. Solange man keine Verzeichnisnamen hat, die mit einem '.php' enden, ist es nicht unbedingt notwendig zu überprüfen ob es sich um eine Datei handelt. Das `glob`-Modul kann die `checkfiles()`-Funktion einfacher machen.

Das sähe dann ungefähr so aus:

Code: Alles auswählen

from glob import glob1

def checkfile(filename, searchstring):
    lines = open(filename, 'r')
    result = [line for line in lines if searchstring in line]
    lines.close()
    return result


def checkfiles(path, glob_pattern, searchstring):
    result = list()
    for filename in glob1(path, glob_pattern):
        lines = checkfile(filename, searchstring)
        if lines:
            result.append((filename, lines))
    return result


def main()
    for entry in checkfiles('.', '*.php', 'SdTa'):
        print entry


if __name__ == '__main__':
    main()
hobbes_dmS
User
Beiträge: 11
Registriert: Mittwoch 18. April 2007, 13:15

@ Klammern: jaaa, ich mach nebenher noch c++, da hat man so ein Gerümpel, das wird man so schnell nicht los.
@2 Zeichen: war so schneller getippt ;)
@rest: da hast du recht, das war aber auch gestern abend innerhalb von 10 Minuten hingeschmiert ;)
jabber-id: hobbes@mi-wgnetz.de
Antworten