Datei öffnen und in Konsole ausgeben

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Benutzeravatar
Helex
User
Beiträge: 33
Registriert: Mittwoch 21. Februar 2007, 09:52
Wohnort: Dessau, Sachsen-Anhalt
Kontaktdaten:

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!
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

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
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
Benutzeravatar
Helex
User
Beiträge: 33
Registriert: Mittwoch 21. Februar 2007, 09:52
Wohnort: Dessau, Sachsen-Anhalt
Kontaktdaten:

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
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

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
Benutzeravatar
Helex
User
Beiträge: 33
Registriert: Mittwoch 21. Februar 2007, 09:52
Wohnort: Dessau, Sachsen-Anhalt
Kontaktdaten:

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
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

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
Benutzeravatar
Helex
User
Beiträge: 33
Registriert: Mittwoch 21. Februar 2007, 09:52
Wohnort: Dessau, Sachsen-Anhalt
Kontaktdaten:

Was für ein Segen, dieses wiki, da steht ja wirklich alles drinn, wie man es sich zurecht konfiguriert.

Hab vielen dank EnteQauK
Antworten