Rechner nach Datei durchsuchen

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
AOJ
User
Beiträge: 21
Registriert: Sonntag 2. Oktober 2011, 13:27

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
busfahrer
User
Beiträge: 111
Registriert: Donnerstag 9. Oktober 2008, 17:42

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
Alles wird gut ;-)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ooops... jupp, hast Recht :oops:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
AOJ
User
Beiträge: 21
Registriert: Sonntag 2. Oktober 2011, 13:27

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()
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
AOJ
User
Beiträge: 21
Registriert: Sonntag 2. Oktober 2011, 13:27

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?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ä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).
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
AOJ
User
Beiträge: 21
Registriert: Sonntag 2. Oktober 2011, 13:27

was meinst du mit ob es bei mir tun kann?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
AOJ
User
Beiträge: 21
Registriert: Sonntag 2. Oktober 2011, 13:27

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?
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...
AOJ
User
Beiträge: 21
Registriert: Sonntag 2. Oktober 2011, 13:27

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?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten