In Welcher datei war das nochmals.. hmm ;)

Code-Stücke können hier veröffentlicht werden.
Antworten
fichtknick
User
Beiträge: 8
Registriert: Mittwoch 20. März 2013, 22:21

Halli Hallo und grüezi Wohl

Vorgestern war es wieder soweit das ich paar sachen suchte, wo ich wusste sie sind in div. conf files, aber in welchen ?? Da hab ich mir ein Programm für genau dieses Dillema geschrieben.

Meine English kenntnisse sind einigermasen ok, aber die grammatik nicht so, also allg. verbesserungs vorschläge sind gerne gesehen, zum Code und zum "english" ;) Ich habe mir auch nochmals PEP8 vorgenommen und glaube es ist damit zu 50% "kompatibel" ;) Ich bin halt auch immer noch am lernen und mich verbessern.

und hier das "schöne" stück:

Code: Alles auswählen

#!/usr/bin/env python3.3
# -*- coding: utf-8 -*-

#                ToDo:
# 1. Make Argument test with "modul argparse".

from sys     import argv, exit
from getpass import getuser
from time    import time
import os

def searching(root, extension, term):
    # Walk recursive from root parameter open all the files with,
    # the right extension and stoping the running time to solve the
    # search.
    start_time = time()
    file_counter = 0
    for (path, dir, files) in os.walk(root):
        for element in files:
            if element.endswith(extension):
                path_file = os.path.join(path, element)
                # sfile = ScanningFile.
                with open(path_file, "r", encoding="ISO-8859-1") as sfile:
                    # rsfile = Read-Scanning-File.
                    rsfile = sfile.read()
                    if term in rsfile:
                        print("found @ {}/{}".format(path,
                              element))
                        file_counter += 1
                    else:
                        pass
    print("\n!-----------------------------------------!\n")
    print("\"{}\" in {} files found. run {} Seconds\n".format(term,
          file_counter, int((time() - start_time))))
    print("!-----------------------------------------!\n")



def main():
    # The main function, testing user and arguments and go to the search.
    if getuser() != 'root':
        print("\nMust run as root\n")
        exit(0)
    
    if len(argv) != 4:
        print("\nNeed Arguments like:\ninfise <root> <file_extension> <Term>\n")
        exit(0)
    else:
        root      = str(argv[1])
        extension = str(argv[2])
        term      = str(argv[3])
    
    searching(root, extension, term)
    
if __name__=='__main__':
    main()
Grüsse Euch

Edit:
Eine frage noch, wen ich z.b.

Code: Alles auswählen

from os import path, walk
mache, dan funktioniert

Code: Alles auswählen

path_file = path.join(path, element)
nicht mehr.
Hat da jemand ein tipp ?
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

Schau mal, wo überall »path« in der Zeile

Code: Alles auswählen

path_file = path.join(path, element)
vorkommt.

»argv« ist schon eine Liste von Strings, eine weitere Konvertierung deshalb überflüssig.
Warum darf nur »root« das Programm ausführen?
»else: pass« ist unnötig.

PS: Du solltest vor allem schauen, dass Dein Deutsch in Grammatik und Rechtschreibung besser wird.
BlackJack

@fichtknick: Anstatt `getpass.getuser()` würde ich lieber über das `os`-Modul die Benutzer-ID des Prozesses verwenden, denn die `getuser()`-Funktion wertet als erstes ein paar Umgebungsvariablen aus, die jeder Benutzer an den Namen 'root' binden könnte, ohne tatsächlich auch die entsprechenden Rechte zu besitzen. Das wäre also ein Test der sehr leicht zu umgehen ist. Allerdings stelle ich mir genau wie Sirius3 die Frage warum man das überhaupt auf einen benstimmten Benutzer einschränken möchte.

Die Kommentare am Anfang der Funktionen wären vielleicht gute Kandidaten für DocStrings.

Kommentare die Namen erklären sollte man durch Namen ersetzen die keine Erklärung benötigen. Insbesondere wenn es sich um abgekürzten Namen handelt und der Kommentar nur die Abkürzung „erklärt”, hätte man auch gleich den Namen ordentlich ausschreiben können. Der Name `rsfile` ist zudem falsch, weil daran gar kein Datei-Objekt gebunden wird, sondern der Inhalt einer Datei. Statt dem generischen `element` würde `filename` genauer ausdrücken worum es sich handelt.

Das Programm ist nicht besonders robust wenn man grosse Dateien hat — die werden ja komplett in den Arbeitsspeicher gelesen — oder wenn man Textdateien hat die nicht ISO-8859-1 kodiert sind. Von Binärdateien mal ganz abgesehen.

Der Rückgabecode 0 wird bei Prozessen üblicherweise verwendet um dem Aufrufer zu sagen, dass alles problemlos durchgelaufen ist. Was bei den beiden expliziten `exit()`-Aufrufen nicht der Fall ist.

Ich hätte wahrscheinlich einfach die Unix-Standardwerkzeuge ``find`` und ``grep`` oder ``ack`` (http://beyondgrep.com/) verwendet, statt mir selbst etwas dafür zu schreiben. :-)
fichtknick
User
Beiträge: 8
Registriert: Mittwoch 20. März 2013, 22:21

Top :)

Jo das problem war, wen ich es als "normalo" user ausführte, ging es nicht, es funktionierte nur wen ich es mit sudo ausführte, deshalb habe ich es so machen müssen.

Genau das habe ich eig. gesucht die User-Id, jetzt wo ich es weis, werde ich es gleich mal umschreiben. Und auch alles alles andere :) setzte mich gleich wieder dahinter.

Danke Euch

und zu:

""PS: Du solltest vor allem schauen, dass Dein Deutsch in Grammatik und Rechtschreibung besser wird.""

Ich ignoriere das mal :) bin erst gerade aufgestanden, noch kein kaffe und im Netz schaue ich nicht so drauf, ist schliesslich kein Bewerbungsschreiben. :)
BlackJack

@fichtknick: Es mag kein Bewerbungsschreiben sein, aber andere müssen es lesen. Oder halt auch nicht wenn sie's nicht ertragen. Es ist also eine Art Bewerbungsschreiben für Hilfe und/oder Kommentare. Ich habe selbst schon Leute ignoriert weil ihr Schreibstil so schlampig war, dass man alles dreimal lesen musste und immer noch nicht genau wusste was der Autor eigentlich sagen oder fragen wollte. (In diese Kategorie fallen Deine Beiträge IMHO nicht.)
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

fichtknick hat geschrieben:Jo das problem war, wen ich es als "normalo" user ausführte, ging es nicht, es funktionierte nur wen ich es mit sudo ausführte, deshalb habe ich es so machen müssen.
Es wäre praktischer, wenn man nicht so eine Einschränkung hätte: man kann es als root ausführen, wenn man einen schreibgeschützten Ordner durchsuchen möchte, ansonsten ist es nicht nötig. Wenn es eine Datei nicht lesen kann wird ja ein Fehler geworfen. Du könntest ja auch eine Fehlerbehandlung einführen, die statt das Programm zu beenden ausgibt: "Datei xy konnte nicht gelesen werden" oder "Ordner xy konnte nicht betreten werden".
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Und als letztes würde ich das Parsing der Parameter mit dem dafür in der Standard Lib vorgesehen Modul erledigen: argparse!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
lunar

Und dann gibt es da ja noch "grep -R" und "ack"…
fichtknick
User
Beiträge: 8
Registriert: Mittwoch 20. März 2013, 22:21

@Hyperion
Steht ja unter Todo zuoberst im Script ;)

@lunar
Natürlich gibt es besseres. ;)
Es geht mir aber auch ums lernen, ich probiere gerne immer, zuerst was eigenes zu erstellen, um voran zu kommen.
Antworten