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?
[String] Alle Wörter zurückliefern die "xxx" entha
-
- 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
willst du nur die "worte" oder immer die ganze Zeile?
jabber-id: hobbes@mi-wgnetz.de
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:

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()
-
- 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
@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