Suche nach Strings in Dateien...

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Die Windows-Dateisuche ist ja so schei**e!!! Sie durchsucht einfach keine *.py Dateien, weil es die ja nicht kennt :evil:
Es gibt zwar Tips, wie man die Suche per REG-Patch erweitern kann, aber das hat bei mir spontan nicht geklappt...

Also hab ich schnell mal eine Suche selber programmiert. Vielleicht kann's jemand gebrauchen:

Code: Alles auswählen

import os, time

class search:
    def __init__( self, path, search_string ):
        self.search_path    = path
        self.search_string  = search_string

        print "Search '%s' in [%s]..." % (
            self.search_string, self.search_path
        )
        print "_"*80

        time_begin = time.time()
        file_count = self.walk()
        print "_"*80
        print "%s files searched in %0.2fsec." % (
            file_count, (time.time()-time_begin)
        )

    def walk( self ):
        file_count = 0
        for root, dirlist, filelist in os.walk(self.search_path):
            for filename in filelist:
                filename = os.path.join( root, filename )
                self.search_file( filename )
                file_count += 1
        return file_count

    def search_file( self, filepath ):
        f = file( filepath, "r" )
        content = f.read()
        f.close()
        if self.search_string in content:
            print filepath
            string_pos = content.find( self.search_string )
            content = content[string_pos-content_window:string_pos+content_window]
            content = content.replace("\n","")
            print ">>>", content
            print


if __name__ == "__main__":
    search_path     = r"W:\JensDE\PyLucid_tarball"
    search_string   = "page_history"
    content_window  = 35
    search( search_path, search_string )
Das Ergebniss in meinem Fall:
Search 'page_history' in [W:\JensDE\PyLucid_tarball]...
________________________________________________________________________________
W:\JensDE\PyLucid_tarball\index.py
>>> gespeichert. self.save_page_history() # Einbl

W:\JensDE\PyLucid_tarball\PyLucid-Objects Dict.mm
>>> EXT="ID - Client-ID"/><node TEXT="page_history - ID-Liste besuchter S

W:\JensDE\PyLucid_tarball\PyLucid_system\sessionhandling.py
>>> pass self.session_data["page_history"] = ",".join( [str(i)

________________________________________________________________________________
79 files searched in 0.31sec.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hier eine erweiterte Variante, mit mehr Parameter. Diese Zeigt auch nicht nur den ersten Treffer in der Datei:

Code: Alles auswählen

import os, time, fnmatch


class search:
    def __init__( self, path, search_string, file_filter ):
        self.search_path    = path
        self.search_string  = search_string
        self.file_filter     = file_filter

        print "Search '%s' in [%s]..." % (
            self.search_string, self.search_path
        )
        print "_"*80

        time_begin = time.time()
        file_count = self.walk()
        print "_"*80
        print "%s files searched in %0.2fsec." % (
            file_count, (time.time()-time_begin)
        )

    def walk( self ):
        file_count = 0
        for root, dirlist, filelist in os.walk(self.search_path):
            for filename in filelist:
                for file_filter in self.file_filter:
                    if fnmatch.fnmatch( filename, file_filter ):
                        self.search_file( os.path.join( root, filename ) )
                        file_count += 1
        return file_count

    def search_file( self, filepath ):
        f = file( filepath, "r" )
        content = f.read()
        f.close()
        if self.search_string in content:
            print filepath
            self.cutout_content( content )

    def cutout_content( self, content ):
        current_pos = 0
        search_string_len = len( self.search_string )
        for i in xrange( max_cutouts ):
            try:
                pos = content.index( self.search_string, current_pos )
            except ValueError:
                break

            content_window = content[ pos-content_extract : pos+content_extract ]
            print ">>>", content_window.encode("String_Escape")
            current_pos += pos + search_string_len
        print


if __name__ == "__main__":
    search_path     = r"W:\JensDE\PyLucid_tarball"
    file_filter     = ("*.py",) # fnmatch-Filter
    search_string   = "page_history"
    content_extract = 35 # Größe des Ausschnittes der angezeigt wird
    max_cutouts     = 20 # Max. Anzahl an Treffer, die Angezeigt werden sollen

    search( search_path, search_string, file_filter )
Ausgabe:
Search 'page_history' in [W:\JensDE\PyLucid_tarball]...
________________________________________________________________________________
W:\JensDE\PyLucid_tarball\index.py
>>> gespeichert.\n self.save_page_history()\n\n # Einbl
>>> ____________________\n\n def save_page_history( self ):\n """\n

W:\JensDE\PyLucid_tarball\PyLucid_system\sessionhandling.py
>>> pass\n\n self.session_data["page_history"] = ",".join( [str(i)
>>> str(i) for i in self.session_data["page_history"]] )\n session_d

________________________________________________________________________________
35 files searched in 0.20sec.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

habe auch gestern sowas gebaut, natürlich um einiges
bescheidener als deine version :)
habe auch noch ne version mit klassen hier rumfliegen,
aber bei der gibts noch 2-3 kleine Fehler, daher hier mein 1. Versuch.
Durchsucht alle Dateien mit einer bestimmten Endung.
Klappt aber bei .doc nicht :/

Code: Alles auswählen


import string, os, shutil, os.path, time, sys, re
global dirs, dic
dirs={} 
dic = {}  
  
def treewalker(directory, callback, fileType, source):
  join = os.path.join
  dirs[directory]=[] 
  for f in os.listdir(directory):
    pathname = join(directory, f)
    if os.path.isdir(pathname):
        dirs[pathname] = []
        treewalker(pathname, callback, fileType, source)
    elif os.path.isfile(pathname) :
        callback(pathname, fileType, source)

def callback(pathname, fileType, source):
  if os.path.splitext(pathname)[1] == fileType:
    test = string.replace(pathname, "\\", "/")    
    out = file(test, "r")
    count = 0
    for line in out.readlines():
      count += 1
      if re.search(source, line):
#        openName = os.path.basename(os.path.splitext(pathname)[0]) + str(count)
#        dic[openName] = pathname
        print "Datei " + pathname + " in Zeile " + str(count)
    out.close()
    
  
def main():
  directory = raw_input("Ordner angeben: ")
  fileType = raw_input("Dateityp angeben: ")
  source = raw_input("Textstelle: ")
  treewalker(directory, callback, fileType, source)
  
if  __name__ == "__main__":
  main()

Code: Alles auswählen

C:\test\python\Hilfreich>findSource.py
Ordner angeben: f:\bla\
Dateityp angeben: .php
Textstelle: fun
Datei f:\bla\content\ger\popup\maschinen.php in Zeile 4
Datei f:\bla\content\ger\popup\maschinen.php in Zeile 33
Datei f:\bla\content\ger\popup\werbeschilder.php in Zeile 4
Datei f:\bla\content\ger\popup\werbeschilder.php in Zeile 33
BlackJack

Leute installiert euch doch wenigstens die wichtigsten Unix-Programme wenn ihr schon mit Windows arbeiten müsst. `grep` gehört einfach zu den Programmen, die man ständig benötigt. :wink:
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

cygwin 4ever :-)
Kurz nachdem ich damit fertig war, ist mir das auch noch
eingefallen und natürlich gibts noch die Windows Suche
die Textstellen suchen kann .. immerhin hab ich was gelernt^^
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

pr0stAta hat geschrieben:natürlich gibts noch die Windows Suche
die Textstellen suchen kann
Das ist ja genau das Problem... Die dumme Windows Suche durchsucht keine *.py Dateien :evil:

Ansonsten, GNU utilities for Win32: http://unxutils.sourceforge.net Aber wenn's doch mit Python geht :D


EDIT:
Eine abgespeckte Version, die nur in einer Datei sucht, hab ich auch gemacht: http://www.python-forum.de/viewtopic.php?p=25026#25026

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten