Seite 1 von 1

Datei öffnen und in Konsole ausgeben

Verfasst: Sonntag 18. März 2007, 15:11
von Helex
Hallo,

ich habe endlich mein eigenes Programm geschrieben. Betrachtet folgenden Quellcode:


Code: Alles auswählen

path = raw_input('Geben sie einen Pfad an: ')    # Benutzer-Eingabe
filetext = raw_input('Dateinamen')                     # Benutzer-Eingabe
	
def  stuff(path, datei):                                      # Funktion  stuff
    try:
        datei = path + datei
        in_file = open(datei, 'r')                            # Datei öffnen und lesen
        text = in_file.read()
        print text                                                # Inhalt ausgeben
    finally:
        in_file.close()                                           # Datei immer schließen
        print '- close file -'
  
stuff(path,filetext)

zu meiner Verteidigung: ich hab bewusst nicht OOP programmiert und eine Frage habe ich noch: Ich hätte gern noch einen normalen exception für einen IOError eingebaut, also im Falle der Pfad oder Dateiname ist falsch. Doch leider ließ sich dies nicht mit dem finally Block arrangieren? Habt ihr Tipps wie ich das machen könnte?

Gruß vom Helex!

Verfasst: Sonntag 18. März 2007, 16:07
von EnTeQuAk
zu meiner Verteidigung: ich hab bewusst nicht OOP programmiert und eine Frage habe ich noch: Ich hätte gern noch einen normalen exception für einen IOError eingebaut, also im Falle der Pfad oder Dateiname ist falsch. Doch leider ließ sich dies nicht mit dem finally Block arrangieren? Habt ihr Tipps wie ich das machen könnte?
Das stimmt. Bei Python-Versionen vor 2.5 geht das nicht. Ab Python 2.5 geht dies jedenfalls wunderbar.

Du könntest das aber auch mit einer Verschachtelten Lösung machen.
Des weiteren.. warum Pfad und Dateiname einzeln abfragen? --> Wenn ich beides weiß, darf ich doch auch beides anwenden oder?

Des weiteren gibt es ein Problem mit deinem Code, wenn ich folgende Werte eintrage:

Code: Alles auswählen

>> Geben Sie den Pfad an: /home/ente/Desktkop
>> Dateinamen: hilfe.txt
Dann versuchst du den Pfad
" /home/ente/Desktophilfe.txt " zu öffnen, welchen es natürlich nicht gibt.

Um das zu vermeiden könntest du das 'os' Modul benutzen:

Code: Alles auswählen

import os

path = raw_input('Geben sie einen Pfad an: ')    # Benutzer-Eingabe
filetext = raw_input('Dateinamen')               # Benutzer-Eingabe

def  stuff(path, datei):                         # Funktion  stuff
    try:
        datei = os.path.join(path, datei)
        in_file = open(datei, 'r')               # Datei öffnen und lesen
        text = in_file.read()
        print text                               # Inhalt ausgeben
    finally:
        in_file.close()                          # Datei immer schließen
        print '- close file -'

stuff(path,filetext)
os.path.join(path, datei)
"vereinigt" sozusagen die beiden, sodass sie den Korrekten Pfad "/home/ente/Desktop/hilfe.txt" ergeben.

Die engültige Lösung könnte z.B. folgende Sein:

Code: Alles auswählen

import os

pfad = raw_input('Geben sie einen Pfad an: ')    # Benutzer-Eingabe
if not os.path.isfile(path):
    dateiname = raw_input('Dateinamen: ')  # Benutzereingabe NUR, wenn vorheriges KEINE Datei war

def  stuff(path, datei):                         # Funktion  stuff
    try:
        try:
            if dateiname:
                # wurde 'dateiname' angegeben?
                datei = os.path.join(path, datei)
            else:
                # pfad war schon der Pfad zur Datei
                datei = pfad

            in_file = open(datei, 'r')               # Datei öffnen und lesen
            text = in_file.read()
            print text                               # Inhalt ausgeben
        except IOError, err:
            print 'Fehler beim lesen der Datei "%s"' % err.filename
    finally:
        in_file.close()                          # Datei immer schließen
        print '- close file -'

stuff(path,filetext)
Die Lösung ist meines Wissens nach die einzige, die 'try, except, finally' Lösung von Python2.5 "nachzustellen".

Ich habe auch gleich noch ein paar Sachen eingefügt, damit du siehst, was so alles möglich ist.

Des weiteren.... so wie ich das sehe, bist du noch nicht lange dabei?
Wenn dem so sein sollte würde ich mich nicht gleich auf OOP stürzen und erstmal die Grundlagen etc. erlernen. OOP ist noch spannend genug :)

Ich hoffe, ich konnte dir weiterhelfen!

MfG EnTeQuAk

Verfasst: Sonntag 18. März 2007, 16:45
von BlackJack
Die "Lösung" sieht irgendwie ziemlich komplex und unschön aus.

Sowohl das Original als auch die Fälschung haben ausserdem ein Problem: Die Datei wird immer geschlossen. Auch wenn sie gar nicht korrekt geöffnet werden konnte. Was dann beim Schliessen natürlich eine Ausnahme nach sich zieht.

Code: Alles auswählen

def stuff(path, filename):
    in_file = open(os.path.join(path, filename), 'r')
    try:
        print in_file.read()
    finally:
        in_file.close()
        print '- close file -'


def main():
    path = raw_input('Geben sie einen Pfad an: ')
    filename = raw_input('Dateiname: ')
    try:
        stuff(path, filename)
    except IOError, error:
        print 'Sch*%#e (%s)' % error

Verfasst: Sonntag 18. März 2007, 19:09
von Helex
Danke Black Jack,

ich werd mir mal das os Modul näher ansehen, ich versuche jeden tag etwas dazu zu lernen und versuche immer einige kleinere Programme zu schreiben.

Ach ja eine Frage habe ich noch: Ich habe skite benutzt und das meckerte andauernd herum und bekomme die Fehlermeldung: IOError: [Errno 9] Bad file descriptor

Hab mich vorhin halb verrückt deswegen gemacht und mein Programm verändert, aber unter IDLE hats dann geklappt :?: .

Vielleicht fehlen ja nur irgendwelche Packete und eine aktueller Python Version...

Gruß, Helex

Verfasst: Sonntag 18. März 2007, 19:44
von EnTeQuAk
Ach ja eine Frage habe ich noch: Ich habe skite benutzt und das meckerte andauernd herum und bekomme die Fehlermeldung: IOError: [Errno 9] Bad file descriptor
Das liegt an Scite... dieses kann Sachen wie raw_input oder input anscheinend nicht richtig verarbeiten... das ist bei mir aber genauso :)


Tipp: In der Konsole/CMD anschauen ;)

MFG EnTeQuAK

Verfasst: Sonntag 18. März 2007, 20:12
von Helex
Hallo EnteQuak,
den Tipp mit Tipp: In der Konsole/CMD anschauen
meinst wohl unter Windows, oder wie? Benutze leider kein Windows, sondern nur kubuntu.

Hat Scite noch weitere Macken?

Gruß Helex

Verfasst: Sonntag 18. März 2007, 20:21
von EnTeQuAk
meinst wohl unter Windows, oder wie? Benutze leider kein Windows, sondern nur kubuntu.
Konsole unter Linux (auch Terminal genannt)
CMD unter Windows ;)


Ansonsten sind mir keine Macken bekannt... suche mal auch im http://wiki.python.de nach 'Scite' :)


MfG EnTeQuAk

Verfasst: Sonntag 18. März 2007, 20:34
von Helex
Was für ein Segen, dieses wiki, da steht ja wirklich alles drinn, wie man es sich zurecht konfiguriert.

Hab vielen dank EnteQauK