Seite 1 von 1

Rechner nach Datei durchsuchen

Verfasst: Montag 28. November 2011, 13:10
von AOJ
Hi hi,

ich habe folgendes Python-Skript, das eine Text-Datei ausliest:

Code: Alles auswählen

datei = "D:/..../text.txt"
in_file = open(datei,"r")
text = in_file.read()
in_file.close()
print (text)
Wenn ich das Skript auf einem anderen Rechner laufen lassen will, muss ich den Pfad ändern. Ist es irgendwie möglich, dass mein Skript die Datei text.txt ohne Eingabe vom Pfad findet? Oder dass Python den Rechner nach der Datei durchsucht?

Danke.

Re: Rechner nach Datei durchsuchen

Verfasst: Montag 28. November 2011, 13:22
von Hyperion
Zunächst einmal solltest Du das `with open() as handler`-Idiom für das Dateihandling benutzen:

Code: Alles auswählen

datei = r"D:/..../text.txt"
with open(datei,"r") as infile:
    text = infile.read()
print(text)
Und bei Pfadangaben verwende RawStrings! (`r""`) Damit vermeidest Du ungewolltes Escaping.

Zum Problem: Natürlich kannst Du das mit Python machen. `os.walk` ist die Funktion, die Du brauchst.

Aber wäre es nicht einfacher, wenn Du den Dateinamen per Parameter an Dein Script übergibst?

Code: Alles auswählen

# oben
import sys

# Deine wahre Funktionalität in Funktionen (!!!) gekapselt
def function(filename):
    pass

# unten
def main():
    if len(sys.argv[1]) == 2:
        function(sys.argv[1])
    else:
        print("Usage: script.py FILENAME")
        sys.exit(1)

if __name__ == "__main__":
    main()
Damit kannst Du je nach System einen geeigneten Pfad an das Programm übergeben.

Sollten die Argumente und ggf. Optionen vielfältiger werden, bietet sich das Modul `argparse` für das Handling der Kommandozeilenparameter an! Für dieses eine Argument habe ich das mal von Hand gebaut.

Re: Rechner nach Datei durchsuchen

Verfasst: Montag 28. November 2011, 13:56
von busfahrer
Hallo

@Hyperion
kann es sein das in deiner "def main" das "if-statement" so aussehen müsste

Code: Alles auswählen

if len(sys.argv) == 2:
oder irre ich mich?

Gruß...busfahrer

Re: Rechner nach Datei durchsuchen

Verfasst: Montag 28. November 2011, 13:59
von Hyperion
Ooops... jupp, hast Recht :oops:

Re: Rechner nach Datei durchsuchen

Verfasst: Montag 28. November 2011, 14:33
von AOJ
Soll es also in meinem Fall wie folgt aussehen?

Code: Alles auswählen

import sys
def function(text):
    datei = "text.txt"
    in_file=open(datei,"r")
    text = in_file.read()
    in_file.close()
    print (text)

def main():
    if len(sys.argv)==2:
           function(sys.argv[1])

    else:
            print ("Usage: uuu.py text")
            sys.exit(1)
            
    
            if __name__ == "__main__":
                    main()

Re: Rechner nach Datei durchsuchen

Verfasst: Montag 28. November 2011, 14:45
von Hyperion
Nein :roll:

Wie Du siehst stimmen die Einrückungen nicht die Bohne! Verwende statt Tabs 4 Spaces. Das kannst Du in jedem guten Editor einstellen. Und auch die Leerzeilen sind irgend wie willkürlich verteilt.

Außerdem lies doch mal mein Posting richtig durch. Ich sehe weder `with` noch stimmt die Parameterübergabe.

Auch als Anfänger kann man präzise vorgehen!

Re: Rechner nach Datei durchsuchen

Verfasst: Dienstag 29. November 2011, 13:44
von AOJ
Wie wäre es mit dem folgenden Skript:

Code: Alles auswählen

import sys
def function(datei):
    print ("die datei", datei)   
    with open (datei,"r") as infile:
        text = infile.read()
    print (text)
datei = r"D:/Jr/Desktop/text.txt"   
def main():
    if len(sys.argv)==2:
           function(sys.argv[1])
    else:
        print ("Usage: ujhzuy text")
        sys.exit(1)     
    
if __name__ == "__main__":
    function(datei)
Stimmt es so?

Re: Rechner nach Datei durchsuchen

Verfasst: Dienstag 29. November 2011, 13:53
von Hyperion
Äh.... rätst Du jetzt wirklich?

Kleiner Tipp: Denk mal drüber nach, was die `main`-Funktion machen soll und ob sie das bei Dir auch tun kann ;-)

Und Zwischen imports und Funktionen können ruhig 2 Leerzeilen stehen (für kurze Snippets hier im Forum genügt auch mal ruhig eine Leerzeile imho).

Re: Rechner nach Datei durchsuchen

Verfasst: Dienstag 29. November 2011, 14:02
von AOJ
was meinst du mit ob es bei mir tun kann?

Re: Rechner nach Datei durchsuchen

Verfasst: Dienstag 29. November 2011, 14:04
von Hyperion
AOJ hat geschrieben:was meinst du mit ob es bei mir tun kann?
Dass sie bei Dir niemals aufgerufen wird! Ergo kann die Funktion ihre Funktionalität nie in Deinen Programmablauf einbringen, ergo ist sie bei Dir nutzlos.

Wenn ich mich recht erinnere war es jedoch Kern der Sache, dass Du eine flexibel einzusetzende Lösung gesucht hast. Dafür ist das, was in der `main`-Funktion passiert jedoch essenziell ;-)

Re: Rechner nach Datei durchsuchen

Verfasst: Dienstag 29. November 2011, 14:09
von AOJ
Wenn ich die main() aufrufe, zeigt python immer den folgenden Fehler:
  • Traceback (most recent call last):
    File "D:\Python32\test.py", line 19, in <module>
    main()
    File "D:\Python32\test.py", line 15, in main
    sys.exit(1)
    SystemExit: 1
Was hat das zu bedeuten?

Re: Rechner nach Datei durchsuchen

Verfasst: Dienstag 29. November 2011, 14:13
von deets
Das sie das tut, was du ihr gesagt hast - sich zu beenden, indem sie eine SystemExit-Exception schmeisst.

Wenn du das so aufrufst, wie du es eigentlich willst - im "__main__"-Block - dann klappt das auch alles...

Re: Rechner nach Datei durchsuchen

Verfasst: Dienstag 29. November 2011, 14:29
von AOJ
Sorry für den Aaufwand :oops:
Ich habe jetzt folgenden:

Code: Alles auswählen

import sys

def function(text):
    pass
      
def main():
    if len(sys.argv) == 2:
        function(sys.argv[1])
    else:
        print ("Usage: file")      
    
if __name__ == "__main__":
    main()
Woher soll das Skript wissen, welche Text-Datei ich öffnen will?

Re: Rechner nach Datei durchsuchen

Verfasst: Dienstag 29. November 2011, 14:33
von Hyperion
AOJ hat geschrieben: Woher soll das Skript wissen, welche Text-Datei ich öffnen will?
http://en.wikipedia.org/wiki/Command-li ... #Arguments

Ein Blick in die Doku von `sys.argv` oder auch `argparse` hätte da wohl für Klarheit gesorgt ;-)

Edit: Ach ja, Dein "Usage"-String macht so keinen Sinn. Ich hatte das schon recht eindeutig spezifiziert, im Moment kann damit niemand etwas anfangen.