Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.python > #4659

Re: [Python-de] Frage zum configparser

From Arnold Krille <arnold@arnoldarts.de>
Newsgroups de.comp.lang.python
Subject Re: [Python-de] Frage zum configparser
Date 2017-01-19 22:02 +0100
Message-ID <mailman.22.1484860089.9761.python-de@python.org> (permalink)
References <o5o87h$q2s$1@tota-refugium.de> <20170118224526.366c8863@xingu.arnoldarts.de> <mailman.15.1484776503.9761.python-de@python.org> <o5quep$gmf$1@tota-refugium.de> <20170119220217.538228e4@xingu.arnoldarts.de>

Show all headers | View raw


[Multipart message — attachments visible in raw view] - view raw

Hallo Manfred,

tl;dr: Entschuldigung.

On Thu, 19 Jan 2017 17:53:29 +0000 (UTC) Manfred Gil
<manfred-gil@t-online.de> wrote:
> kann es sein, das Du gestern einen schlechten Tag hattest ;-)

Ja, vielleicht. Entschuldigung falls das Emotionen in mein Email
gepackt hat, die bei Dir zu negativen Emotionen geführt haben. Das
wollte ich nicht!

> Wieso sollte ich mir _nicht_ Gedanken darum machen, ob ich das File
> wieder schließen sollte.
> <code>
> daten = open('READNE.txt','r')
> text = daten.read()
> daten.close()
> print(text)
> 
> </code>
> 
> ist für mich im ersten Augenblick nichts anderes.
> Sicher, jetzt kommen alle Python Nerds an und erklären mir den
> Unterschied, zwischen den beiden code stücken von mir.

Yep, hier kommt einer. Denn:

Wenn ich Deine ursprüngliche Frage richtig verstehe, dann ist das
Beispiel oben nicht passend zu Deiner ursprünglichen Frage.
Das Beispiel müsste lauten:

<code>
text = read_from_file('READNE.txt')
print(text)
</code>

Und wenn ich Dich richtig verstehen, denkst Du darüber nach, ob Du das
file schliessen musst?

Meine Gegenfrage lautet: Welches File?

Die Implementierung von read_from_file ist nicht bekannt, die Eingabe
in die Funktion ist ein Dateiname (und Pfad) als string, die Rückgabe
der Funktion ist auch ein string mit dem Inhalt der Datei.

Wenn Du in Python Dateien selber öffnen willst, dann werden die
repräsentiert durch File-Objekte (high level) oder durch file-handles
(low level).

So ein File-Objekt erhälst Du, wenn Du 'open("filename", "r")' machst.
Ein file-handle ist im Prinzip ein integer, der die geöffnete Datei im
Speicher markiert und wird Dir von 'os.open("filename", …)' zurück
gegeben.

Das File-Objekt lässt sich schliessen indem man auf dem Objekt
'.close()' aufruft, der file-handle wird geschlossen durch
'os.close(handle)'.

Aber: In dem Beispiel hast Du beides nicht und bekommst auch nichts
davon aus der Funktion zurück. Und weder auf dem string des
Dateinamens, noch auf dem string des Rückgabewertes kann man irgendwas
schließen. ('text.close()' gibt nen AttributeError.)

Jetzt zur Implementierung von 'read_from_file': Es gibt mehrere
Möglichkeiten den Inhalt einer Datei zu lesen, ein paar davon will ich
im folgenden Aufschreiben.

<code>

def read_from_file1(filename):
    f = open(filename, 'r')
    text = f.read()
    f.close()
    return f

def read_from_file2(filename):
    with open(filename, 'r') as f:
        text = f.read()
    return f

def read_from_file3(filename):
    f = open(filename, 'r')
    return f.read()

def read_from_file4(filename):
    return open(filename, 'r').read()

def read_from_file5(filename):
    f = os.open(filename, os.O_RDONLY|os.O_TEXT)
    text = os.read(f, INT_MAX)  # read, a lot
    os.close(f)
    return text

</code>

Alle diese Funktionen machen das gleiche, sie öffnen die Datei, lesen
den Inhalt (in Fall 5 nur maximal die ersten INT_MAX bytes ;) ) und
schliessen die Datei wieder um den gelesen Text dann zurück zu geben.
Lediglich im Fall 5 ist es möglich das der file-handle offen zurück
bleibt und dann nicht mehr erreichbar ist, vorausgesetzt man vergisst
die Zeile mit 'os.close(f)'.

Fun Fact: Wenn das File-Objekt gelöscht wird, schließt es die Datei
wenn nötig. Und gelöscht wird das Objekt entweder weil es mit 'del'
gelöscht wird, oder weil es out-of-scope geht. Beispielsweise weil die
Funktion, in der es lebt, zu Ende ist (Fall 3 und 4). Der
Kontextmanager in Fall 4 sorgt übrigens dafür, das die Datei
geschlossen wird egal was für Fehler innerhalb des Blocks passieren.


> Ich bin und nicht anderes behaupte ich von mir, ein Hobby Python(man).
> in meiner "kleinen" Freizeit ... nach dem Job ... und Familie,
> "Bastle" ich mir Programme die mir genügen sollten.
> Sicher sind meine Ansprüche an mir selber, meist zu hoch angesetzt,
> doch ich beiss mich durch. Manche Probleme lösen sich durchs lesen
> von Dokus oder durch das Mitlesen in Forum. Andere Sachen sind dann
> irgendwie nicht ganz geheuer für mich, wie mit dem Configpraser.

Tut mir leid wenn ich da gestern (und heute?) etwas Oberlehrerhaft
rüber komme. Das will ich gar nicht. Oder meine es zumindest doch nur
gut.

Beim Anblick Deiner Frage hatte ich halt zwei Befürchtungen (siehe
Svens Vermutung):

Entweder hast Du in Deiner C- und Perl-Erfahrung tatsächlich schon so
viele Fälle von so einem Konstrukt gesehen, das Du Dir Deine
Originalfrage da tatsächlich sehr häufig so stellen musst. Dann sinken
C und Perl in meinem ansehen noch tiefer und ich werde nie wieder eine
Zeile davon lesen, geschweige denn schreiben.

Oder Du weißt es einfach noch nicht besser. Was nicht schlimm ist. Wir
haben schließlich alle mal angefangen. Dann ist meine Hoffnung, das Du
irgendwann (möglichst bald!) soweit bist, das Du Code nicht nur "für
Dich" sondern auch "für Alle" schreibst. Und dann möchte ich Dir
helfen, das es guter Code ist mit klaren Konzepten und eindeutigen
Schnittstellen. Nicht das ich dann irgendwann über Code stolpere, der
eine globale Variable nutzt um ein file-Objekt offen zu lassen damit
ich es selber schließen muss. Oder so…

> Aber na ja, lassen wir das. Hier hatte ich schnelle und
> unkomplizierte Hilfe bekommen, wie meistens... ne immer :-)

Hm, vielleicht will man nicht nur schnelle Hilfe sondern manchmal auch
noch ein wenig über Code und Konzepte philosophieren? Programmieren
bzw. Software entwickeln hat meiner Erfahrung immer weniger mit Code
und immer mehr mit Nachdenken zu tun je mehr Entwicklungserfahrung man
hat.

Bis denn,

Arnold

Back to de.comp.lang.python | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Frage zum configparser Manfred Gil <manfred-gil@t-online.de> - 2017-01-18 17:21 +0000
  Re: [Python-de] Frage zum configparser "Sven R. Kunze" <srkunze@mail.de> - 2017-01-18 18:39 +0100
    Re: [Python-de] Frage zum configparser Manfred Gil <manfred-gil@t-online.de> - 2017-01-18 17:56 +0000
  Re: [Python-de] Frage zum configparser "Diez B. Roggisch" <deets@web.de> - 2017-01-18 18:35 +0100
    Re: [Python-de] Frage zum configparser Manfred Gil <manfred-gil@t-online.de> - 2017-01-18 17:55 +0000
  Re: [Python-de] Frage zum configparser Arnold Krille <arnold@arnoldarts.de> - 2017-01-18 22:45 +0100
    Re: [Python-de] Frage zum configparser Manfred Gil <manfred-gil@t-online.de> - 2017-01-19 17:53 +0000
      Re: [Python-de] Frage zum configparser Arnold Krille <arnold@arnoldarts.de> - 2017-01-19 22:02 +0100
        Re: [Python-de] Frage zum configparser Manfred Gil <manfred-gil@t-online.de> - 2017-01-20 18:57 +0000
          Re: [Python-de] Frage zum configparser "Sven R. Kunze" <srkunze@mail.de> - 2017-01-20 20:32 +0100
            Re: [Python-de] Frage zum configparser Manfred Gil <manfred-gil@t-online.de> - 2017-01-21 15:44 +0000
  Re: [Python-de] Frage zum configparser "Sven R. Kunze" <srkunze@mail.de> - 2017-01-19 15:33 +0100

csiph-web