Was ist ein Dateiobjekt

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
andiT
User
Beiträge: 7
Registriert: Dienstag 29. Oktober 2013, 00:58

Hallo Forumsmitglieder,

ich habe soeben zum Programmieren begonnen und das mit Python.
Nun beschäftige ich mich ein wenig mit den Themen Datei und Strings.
Hierbei bin ich auf den Begriff "Dateiobjekt" gestoßen. Leider konnte ich keine Erklärung/Definition dieses Begriffes finden. Man liest immer wieder, dass beim Öffnen einer Datei ein Dateiobjekt erzeugt wird, aber um was es sich hierbei handelt bleibt außen vor.
Durch herumprobieren denke ich zumindest herausgefunden zu haben, dass ich das Dateiobjekt anstelle der Datei nehme, wenn ich mit der entsprechenden Datei etwas machen (lesen,schreiben,...) möchte. Aber ob dies wirklich so ist, und wenn dann weshalb, ist mir schleierhaft.
Somit bitte ich hier um eine kurze, anfängertaugliche Erklärung.


Eine weitere Frage, die im Verhältnis zur ersten offtopic ist möchte ich dennoch anbringen, da es sich vermutlich um eine Anfängerfrage handelt, die by the way beantwortet werden könnte:

Und zwar wenn ich einen string habe zB:
this_string = "Hallo ich kenn mich nix aus!"
und dann die Methode .split() anwende, also
this_string = this_string.split()

erhalte ich dann eine Liste und ist eine Liste das selbe wie ein array und wie ein feld, denn das Ergebnis des Inhaltes von a_string ist dann ja:
'Hallo', 'ich', 'kenn', 'mich', 'nix', 'aus'

aber: wenn das solch eine Liste wäre, dann müsste ja der Inhalt direkt veränderbar (mutable?) sein (im Unterschied zu zB Integervariablen), dies bedeutet wenn ich jetzt zB

this_string[1].upper() mache, dann müsste 'ich' zu 'ICH' werden und zwar direkt anstelle des alten 'ich'.
wenn ich mir jedoch den Inhalt von thins_string ansehe ist 'ich' noch immer klein geschrieben?

wo wäre da meine Wissenslücke, oder mein Denkfehler?

Jedenfalls vielen Dank für eure Hilfe und liebe Grüße

AndiT
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Hallo andiT,

herzlich Willkommen im Forum!
Zu deiner ersten Frage: http://docs.python.org/2/tutorial/input ... ting-files

Mit einer Google Suche wirst du eigentlich immer fündig.

Zur zweiten Frage:
Strings sind immutable, also unveränderbar. this_string[1] gibt dir ja einen String zurück, den du also nicht direkt verändern kannst. this_string[1].upper() hat also mit dem Alten nichts mehr zu tun hat.

Wenn du den Listeninhalt verändern willst, musst du den zurückgegeben String der Liste zuweisen, also

Code: Alles auswählen

this_string[1] = this_string[1].upper()
In Python handelt es sich bei: [] um Listen und keine Arrays oder Felder.
Für Python Code im Forum gibt es übrigens entsprechende Code Tags :)

Grüße,
anogayales
andiT
User
Beiträge: 7
Registriert: Dienstag 29. Oktober 2013, 00:58

Hallo,

und danke für die rasche Antwort. Soweit mich mein Englisch nicht im Stich gelassen hat, steht auf dieser Seite auch nur, dass durch das Öffnen ein file object erzeugt wird.
Auf das "was" das eigentlich ist (der Kernpunkt meiner Frage) wird hier auch nicht weiter eingegangen.
Evtl. habe ich meine Frage etwas verworren formuliert: Ich würde gerne wissen worum es sich bei einem Dateiobjekt handelt (was das ist, wozu es dient, wie es funktioniert) und nicht lediglich "wann es da ist".

Deine Erklärung mit dem String muss ich mir erst durch den Kopf gehen lassen, aber dafür ist mir heute die Stunde bereits zu spät :).
Danke für den Tipp mit der Codeeingabe!

Gutz Nächtle und greetz

AndiT
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Noch konkreter:
http://docs.python.org/2/library/stdtyp ... le-objects

Ich hoffe, dass reicht dir :)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Was soll man darauf groß antworten? Ein Dateiobjekt ist eine Instanz, die dir Methoden für den Dateizugriff bereitstellt. Dateiobjekte werden meistens via `open()` erstellt und benötigen als Mindestangabe den Pfad, auf den sich die Zugriffe beziehen sollen. Von C kennt man ja Filehandles, die einen Verweis auf eine Datei darstellen sollen - in Python sind es halt diese Dateiobjekte.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@andiT: Was ist Deine Vorstellung von einer Datei? Was ist eine Datei? Zuerst einmal eine abstrakte Vorstellung von einem Ding, aus dem man lesen und in das man hineinschreiben kann, es hat einen festen Ort, usw.
Mit dieser Vorstellung kann ein Computer aber nichts anfangen.
Genauso verhält es sich im Übrigen mit allem anderen auch, nur fällt es Dir da vielleicht nicht so auf, weil Deine Vorstellung mit der konkreten Implementierung besser übereinstimmt. Der Computer kennt keine Zahl, keine Zeichen, sondern nur mehr oder weniger gute Repräsentationen davon.
Ein Objekt ist dagegen etwas konkretes. Ein Objekt hat einen Zustand, der dadurch definiert ist, dass Bits in einem Bereich im Speicher bestimmte Werte haben. Für Objekte sind Methoden definiert, wie »read« oder »write«, oder "add" und »sub«. Nur sagt eben niemand Zahlobjekt oder Zeichenobjekt, wäre auch ziemlich umständlich bei "a = 5+6" zu schreiben: Zuerst wird das Zahlobjekt 5 dann das Zahlobjekt 6 erzeugt, dann die __add__-Methode des ersten Zahlobjekts mit dem zweiten Zahlobjekt als Argument aufgerufen. Dies liefert ein neues Zahlobjekt, das an den Namen »a« gebunden wird. Viel zu umständlich, obwohl es korrekt wäre.
Warum bei Dateien der Objektcharakter so herausgestellt, liegt vielleicht daran, dass Datei das ist, was auf der Festplatte liegt, und Dateiobjekt das ist, was im Speicher ist.
andiT
User
Beiträge: 7
Registriert: Dienstag 29. Oktober 2013, 00:58

Hallo Sirius,

Vielen Dank! Eine sehr schöne Erklärung!
Jetzt wird der Begriff für mich schon fassbarer.

liebe Grüße, AndiT
BlackJack

@andiT: Ich versuche es auch noch mal. Eine Datei ist erst einmal ein abstraktes Konzept. Das ist ein „Ding” was in einem von zwei Zuständen sein kann „offen” und „geschlossen”. Man kann es schliessen um vom „offenen” in den „geschlossenen” Zustand zu kommen.

Im „offenen” Zustand kann man einige Sachen damit anstellen. Bytes schreiben und/oder lesen. Mindestens eines von beidem. Das wäre auch schon das minimale was eine Datei leisten muss um eine Datei zu sein.

Optional kann eine Datei auch einen Namen haben und unter diesem Namen auf einem Dateisystem erreichbar sein. Das ist dann die klassische Datei auf einem Speichermedium wie Festplatten oder USB-Speichermedien und ähnliches.

Dann gibt es Dateien mit wahlfreiem Zugriff wo man einen Zeiger innerhalb der Bytes setzten kann welche den Dateiinhalt ausmachen, und die nächsten Schreib- oder Leseoperation bezieht sich dann relativ auf diesen Zeiger.

Und es gibt Dateien bei denen es keinen wahlfreien Zugriff gibt, die ein Datenstrom sind den man nur in einer Richtung abarbeiten kann. Das sind zum Beispiel die Standardeingabe und Ausgabedateien in der Regel die jedes (Konsolen)Programm hat und über die mit dem Programm kommuniziert werden kann welches das Konsolenprogramm gestartet hat. Also in vielen Fällen ein(e) Terminal/Konsole/Eingabeaufforderung/… also das Programm in dem der Benutzer Text eingibt und das Programm Text ausgibt.

Ein Dateiobjekt in Python ist nun ein Objekt was eine solche Datei repräsentiert, damit der Programmierer die Operationen darauf durchführen kann und Zustände abfrage kann. Dafür gibt es ein `closed`-Attribut um den Zustand „offen”/„geschlossen” anzufragen, eine `close()`-Methode um vom „offenen” in den „geschlossenen” Zustand zu wechseln, eine `read()` und eine `write()`-Methode um zu lesen oder zu schreiben, ein `name`-Attribut um den Namen abzufragen (was nicht zwingend der Name einer auf einem Speichermedium existierenden Datei sein muss), `tell()` und `seek()` um den Dateizeiger zu manipulieren, und noch einiges mehr.

Wobei das jetzt im wesentlichen die Beschreibung von einem Objekt ist welches zum Beispiel von `open()` zurück gegeben wird. Mit Dateiobjekt kann auch eines gemeint sein was nur einen Bruchteil dieser Funktionalität besitzt und nicht alle Attribute/Methoden die Objekte haben, die von `open()` zurückgegeben werden. Man spricht dann manchmal auch von „file like objekts” also von dateiähnlichen Objekten. Die haben dann zum Beispiel nur eine `read()`- und eine `close()`-Methode oder gar nur eine `read()`-Methode.

Man versucht nämlich in der Regel Funktionen/Methoden so zu schreiben, dass sie möglichst allgemein funktionieren und die Parameter nicht unnötig einschränken. Eine Funktion die binäre Dateien einliest und verarbeitet wird normalerweise so geschrieben, dass sie nur die `read()`-Methode verwendet. Das funktioniert dann mit *jedem* Objekt was eine `read()`-Methode besitzt die sich so verhält wie die eines `file`-Objektes. Ob das nun ein `file`-Objekt ist, eines das eigentlich eine Verbindung zu einem anderen Rechner über das Netz darstellt, oder ein `io.BytesIO`-Objekt was ausschliesslich im Arbeitsspeicher existiert, oder irgend etwas anderes mit einer passenden `read()`-Methode.

Bei Funktionen/Methoden die Text zeilenweise verarbeiten schreibt man den Code sogar so, dass er völlig unabhängig von Datei-Objekten ist. Da `file`-Objekte iterierbar sind, und dabei die einzelnen Zeilen als Elemente liefern, kann man sie einfach als iterierbare Objekte behandeln wie viele andere Container-Objekte auch. Einzige Besonderheit dabei, zum Beispiel gegenüber einer Liste mit Zeichenketten, ist das man über Dateiobjekte nur einmal iterieren kann, weil dann der Dateizeiger am Ende der Datei angekommen ist.
andiT
User
Beiträge: 7
Registriert: Dienstag 29. Oktober 2013, 00:58

Hallo BlackJack,

herzlichen Dank für die ausführliche Antwort und die Arbeit und Zeit die damit verbunden ist!

ich scheine in gewisser Hinsicht doch "auf der Leitung zu stehen".
Ich habe da zwei Gedankenansätze, die wohl beide falsch sein dürften:
1. Ein Dateiobjekt "speichert" den Inhalt einer Datei. Innerhalb des Dateiobjekts kann ich den Inhalt der Datei dann manipulieren und letztlich evtl. wieder in die Datei zurückschreiben.
2. Ein Dateiobjekt ist ein Zeiger auf den Inhalt einer Datei. Mit den Methoden und Funktionen greife ich dann über den Zeiger direkt auf den Inhalt einer Datei zu.

Trifft eine dieser Annehmen (so halbwegs) zu bwz. kann man diese ein wenig adaptieren um zur tatsächlichen "Funktionsweise" eines Dateiobjekts zu gelangen?

Letztlich natürlich ein Dank an alle die sich meiner hier so rasch angenommen haben!

liebe Grüße, andiT
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@andiT: obwohl das von der konkreten Implementierung abhängt, die für den Anwender keine Rolle spielen braucht, ist Variante 1 seltener als Variante 2 anzutreffen.
BlackJack

@andiT: Ich denke Du versuchst aus einer Datei mehr zu machen als sie ist. Das ist ein „Ding” wo man Bytes lesen und/oder schreiben kann. Im Grunde war es das. Was da genau beim lesen und schreiben passiert kann *sehr* unterschiedlich sein. Der Sinn und Zweck von Dateien ist es ja gerade diese Unterschiede vor dem Benutzer zu verstecken.
andiT
User
Beiträge: 7
Registriert: Dienstag 29. Oktober 2013, 00:58

OK, dann akzeptiere ich das mal. Vermutlich wird sich mein Horizont beim doing erweitern

Vielen Dank euch allen!
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

andiT hat geschrieben:Durch herumprobieren denke ich zumindest herausgefunden zu haben, dass ich das Dateiobjekt anstelle der Datei nehme, wenn ich mit der entsprechenden Datei etwas machen (lesen,schreiben,...) möchte. Aber ob dies wirklich so ist, und wenn dann weshalb, ist mir schleierhaft.
Somit bitte ich hier um eine kurze, anfängertaugliche Erklärung.
Stell dir vor, du klickst im Dateimanager deines Betriebssystems (z.B. Windows-Explorer) doppelt auf eine Textdatei - oder allgemeiner: Du öffnest die Datei XY in jedem Fall mit einem Texteditor. Das ist - ganz grob gesagt - ähnlich zu dem, was bei `open()` passiert.

Technisch gesehen ist ein wichtiger Unterschied, dass das Öffnen im Texteditor auch gleichzeitig den Dateiinhalt in den Speicher liest, weil dieser ja dem Benutzer angezeigt werden muss. Dies passiert bei `open()` *nicht* automatisch. Das müsstest du dann noch explizit mit einem `.read()`-Aufruf auf dem erstellten Dateiobjekt anweisen, damit dann ein String zurückgeliefert wird, welcher dem Dateiinhalt entspricht.

Beim Schreiben ist es so, dass jede Veränderung am Text in deinem Editor prinzipiell ähnlich zu einem `.write()` auf Dateiobjekten ist. Nur wird man `.write()` nicht für jeden einzelnen Tastendruck aufrufen, sondern den veränderten Inhalt meistens in einem Rutsch in die Datei schreiben wollen. Aber Vorsicht: Dies entspricht noch nicht einem Klick auf "Speichern unter..." im Texteditor! Denn `.write()` schreibt die Änderungen in der Regel nicht sofort wieder in die echte Datei zurück, sondern behält sie erstmal in einer Art Zwischenspeicher. Erst ein `.close()` auf dem Dateiobjekt garantiert, dass die Änderung an der Datei auch tatsächlich von "außerhalb" sichtbar ist. (Will man die Datei noch offen halten, aber trotzdem sofort die Änderungen sehen, dann muss man dazu übrigens `.flush()` benutzen - aber das lasse ich der Einfachheit halber mal außen vor...)

Nochmal zusammengefasst: `open()`-Aufrufe dienen *der Vorbereitung* für nachfolgende Operationen auf Dateien. Dazu wird ein Dateiobjekt erstellt, welches eine relativ leicht handbare Schnittstelle für den Programmierer zur Verfügung stellt, damit er die gewünschten Operationen anweisen kann. Vorsicht ist übrigens geboten, wenn dem `open()`-Aufruf der Parameter "w" (Schreibmodus) mitgegeben wird. Dieser wird benötigt, um den Dateiinhalt komplett neu zu schreiben und kommt sehr oft bei Schreibzugriffen vor (es gibt noch leicht abgewandelte Modi zum Schreiben, die aber IMHO ebenfalls aus Gründen der leichten Verstehbarkeit erstmal keine große Rolle spielen sollen). Im Gegensatz zu einem lesenden `open(dateiname)`, wo noch nicht viel kaputt gehen kann, löscht ein `open(dateiname, "w")` umittelbar den gesamten Dateiinhalt! Spätestens dafür sollten also zum ersten Testen besser keine wichtigen Files genommen werden... ;)
andiT
User
Beiträge: 7
Registriert: Dienstag 29. Oktober 2013, 00:58

Eine sehr schöne und ausführliche Erklärung snafu, danke!
Antworten