Datei einlesen

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
moose
User
Beiträge: 7
Registriert: Freitag 19. Februar 2010, 16:26

Hi,

ich habe ein Skript geschrieben, das mir unter anderem eine Datei einliest, die in einem Unterordner ist. Mit folgendem Skript kann man auf diese Datei zugreifen:

Code: Alles auswählen

import os

pfad = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'Ordnername') 
dateiname = "dateiname.txt"
datei = os.path.join(pfad, dateiname)

try:
    fobj = open(datei, "r")
except IOError:
    print 'Konnte Datei ' + datei + ' nicht oeffnen!'
    print 'Bitte ueberpruefen Sie, ob Sie den Pfad angepasst haben.'
else:
    print "Juhu, hat geklappt"
    fobj.close()
Ist es möglich ein Dialogfenster öffnen zu lassen? Ich nutze Linux (Ubuntu 9.10), würde das Programm dann auch unter Windows / anderen Linux-Systemen funktionieren? Muss ich dann dazu Tk nutzen?

edit: das close hatte ich vergessen
edit2: ich habe nun die Lösung hinzugefügt.
Zuletzt geändert von moose am Samstag 6. März 2010, 17:35, insgesamt 5-mal geändert.
Dackel
User
Beiträge: 11
Registriert: Mittwoch 4. März 2009, 20:44

Hallo,

wenn man eine Datei öffnet sollte man sie im Anschluss natürlich auch wieder schließen. Das lässt sich automatisieren mit einem Context manager:

Code: Alles auswählen

with open(datei, "r") as fobj:
    do_stuff()
Die gibt's ab Python 2.6 oder wenn man sie in Python 2.5 mit

Code: Alles auswählen

from __future__ import with_statement
importiert.

Die IO-Operationen und Tk abstrahieren dir die OS-spezifischen Dinge teilweise schon weg. Was die Pfade angeht, solltest Du dir allerdings mal die Funktionen unter os.path im os-Modul anschauen, mit denen Du auch die Unterschiede im Pfadaufbau zwischen Windows und UNIX in den Griff kriegen kannst.
Benutzeravatar
DeKugelschieber
User
Beiträge: 82
Registriert: Sonntag 28. Februar 2010, 12:23
Kontaktdaten:

bis auf das close, was soll man anders machen?
MfG DeKugelschieber
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo DeKugelschieber

Hier noch mehr Info zu 'with':
http://effbot.org/zone/python-with-statement.htm

Gruß wuf :wink:
Take it easy Mates!
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Noch ein Tipp: Wenn man mit Pfaden und Dateinamen plattformübergreifend arbeiten möchte, nicht einfach Strings addieren, sondern `os.path.join` und Freunde benutzen:

Code: Alles auswählen

import os
os.path.join(path, filename)
Stefan
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

DeKugelschieber hat geschrieben:bis auf das close, was soll man anders machen?
Nichts. Es ersetzt:

Code: Alles auswählen

try:
    f = open(filename)
    [...]
finally:
    f.close()
Ist halt kürzer, eleganter und verleitet eher dazu, einen Stream wieder vernünftig zu schliessen. Ich sehe das so ein bißchen wie ganzen `free()`s, Testen auf NULL beim Allokieren usw, die man in C auch schon mal leicht vergessen kann. Von Python erwartet man ja, dass einem genau diese Art von lowlevel-Kram abgenommen wird und daher reiht sich das with-Statement für mich da ein.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@snafu: Denk noch einmal über dein open und dein close nach ;-)
Das Leben ist wie ein Tennisball.
moose
User
Beiträge: 7
Registriert: Freitag 19. Februar 2010, 16:26

Das close hatte ich schlicht vergessen...

@sma: Danke, so was hab ich gesucht

Wie bekomme ich den Pfad, in dem das aktuell ausgeführte Python-Skript liegt?
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

EyDu hat geschrieben:@snafu: Denk noch einmal über dein open und dein close nach ;-)
Sag mir, worüber genau. Dass Speichermanagement etwas anderes ist als das ordnungsgemäße Schliessen einer Datei, ist mir bewusst. Trotzdem wird IMHO öfter mal der Fehler gemacht, dass die Datei nicht geschlossen wird. Häufig passiert ja auch nichts.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

os.getcwd() sagts dir ;)

(PyCrust)

Code: Alles auswählen

>>> import os
>>> os.getcwd()
'C:\\Programme\\wxPython2.8 Docs and Demos\\scripts'
>>> 
the more they change the more they stay the same
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Dav1d hat geschrieben:os.getcwd() sagts dir ;)
Nein!
Datei Test.py:

Code: Alles auswählen

import os
print os.getcwd()
print os.path.abspath(__file__)
Aufruf von Test.py aus C:

Code: Alles auswählen

[c:\]c:\programme\python26\scripts\test\Test.py
Ausgabe:

Code: Alles auswählen

C:\
C:\programme\python26\scripts\test\Test.py
MfG
HWK
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Dav1d:

Das aktuelle Arbeitsverzeichnis muss nicht dem Verzeichnis entsprechen, wo das Modul liegt. Mein Vorschlag:

Code: Alles auswählen

import os

print os.path.dirname(os.path.abspath(__file__))
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

HWK hat geschrieben:
Dav1d hat geschrieben:os.getcwd() sagts dir ;)
Nein!
Da war aber jemand kurz angebunden :O
`os.getcwd` liefert nur das Arbeitsverzeichnis, nicht den wirklichen Pfad zur Datei. Das kann das selbe Verzeichnis sein (z.B. bei `python test.py`), muss es aber nicht (z.b. bei `python /usr/bin/test.py` - angenommen man ist nicht in `/usr/bin` natuerlich).
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

cofi hat geschrieben:
HWK hat geschrieben:
Dav1d hat geschrieben:os.getcwd() sagts dir ;)
Nein!
Da war aber jemand kurz angebunden :O
War nicht böse gemeint.
Andere Möglichkeit (je nachdem, was der OP mit dem aktuell ausgeführten Python-Skript meint):

Code: Alles auswählen

os.path.abspath(sys.argv[0])
MfG
HWK
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Oh, danke :oops:
the more they change the more they stay the same
moose
User
Beiträge: 7
Registriert: Freitag 19. Februar 2010, 16:26

Vielen Dank für eure Hilfe! Mit folgender Zeile bekomme ich was ich will:

Code: Alles auswählen

pfad = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'Ordnername')
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@snafu: Argh, ich hatte das Beispiel schon fertig, nur vergessen es zu posten:

Code: Alles auswählen

>>> try:
...     f = open(1)
... finally:
...     f.close()
...
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
NameError: name 'f' is not defined
>>>
Das Leben ist wie ein Tennisball.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Achja, stimmt.
Antworten