Path: csiph.com!fu-berlin.de!uni-berlin.de!not-for-mail From: Arnold Krille Newsgroups: de.comp.lang.python Subject: Re: [Python-de] Frage zum configparser Date: Thu, 19 Jan 2017 22:02:17 +0100 Lines: 177 Message-ID: References: <20170118224526.366c8863@xingu.arnoldarts.de> <20170119220217.538228e4@xingu.arnoldarts.de> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/PbUeV2OqDOks3bWYuDAChKF"; protocol="application/pgp-signature" X-Trace: news.uni-berlin.de p9wvwv2dwcPQJva5a89cWgOE8Z/kea4owz60WDPfVbWQ== Return-Path: X-Original-To: python-de@python.org Delivered-To: python-de@mail.python.org X-Virus-Scanned: amavisd-new at heinlein-support.de In-Reply-To: X-BeenThere: python-de@python.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Die Deutsche Python Mailingliste List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Mailman-Original-Message-ID: <20170119220217.538228e4@xingu.arnoldarts.de> X-Mailman-Original-References: <20170118224526.366c8863@xingu.arnoldarts.de> Xref: csiph.com de.comp.lang.python:4659 --Sig_/PbUeV2OqDOks3bWYuDAChKF Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hallo Manfred, tl;dr: Entschuldigung. On Thu, 19 Jan 2017 17:53:29 +0000 (UTC) Manfred Gil 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=C3=BChrt haben. Das wollte ich nicht! > Wieso sollte ich mir _nicht_ Gedanken darum machen, ob ich das File > wieder schlie=C3=9Fen sollte. > > daten =3D open('READNE.txt','r') > text =3D daten.read() > daten.close() > print(text) >=20 > >=20 > ist f=C3=BCr mich im ersten Augenblick nichts anderes. > Sicher, jetzt kommen alle Python Nerds an und erkl=C3=A4ren mir den > Unterschied, zwischen den beiden code st=C3=BCcken von mir. Yep, hier kommt einer. Denn: Wenn ich Deine urspr=C3=BCngliche Frage richtig verstehe, dann ist das Beispiel oben nicht passend zu Deiner urspr=C3=BCnglichen Frage. Das Beispiel m=C3=BCsste lauten: text =3D read_from_file('READNE.txt') print(text) Und wenn ich Dich richtig verstehen, denkst Du dar=C3=BCber 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=C3=BCckgabe der Funktion ist auch ein string mit dem Inhalt der Datei. Wenn Du in Python Dateien selber =C3=B6ffnen willst, dann werden die repr=C3=A4sentiert durch File-Objekte (high level) oder durch file-handles (low level). So ein File-Objekt erh=C3=A4lst Du, wenn Du 'open("filename", "r")' machst. Ein file-handle ist im Prinzip ein integer, der die ge=C3=B6ffnete Datei im Speicher markiert und wird Dir von 'os.open("filename", =E2=80=A6)' zur=C3= =BCck gegeben. Das File-Objekt l=C3=A4sst 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=C3=BCck. Und weder auf dem string des Dateinamens, noch auf dem string des R=C3=BCckgabewertes kann man irgendwas schlie=C3=9Fen. ('text.close()' gibt nen AttributeError.) Jetzt zur Implementierung von 'read_from_file': Es gibt mehrere M=C3=B6glichkeiten den Inhalt einer Datei zu lesen, ein paar davon will ich im folgenden Aufschreiben. def read_from_file1(filename): f =3D open(filename, 'r') text =3D f.read() f.close() return f def read_from_file2(filename): with open(filename, 'r') as f: text =3D f.read() return f def read_from_file3(filename): f =3D open(filename, 'r') return f.read() def read_from_file4(filename): return open(filename, 'r').read() def read_from_file5(filename): f =3D os.open(filename, os.O_RDONLY|os.O_TEXT) text =3D os.read(f, INT_MAX) # read, a lot os.close(f) return text Alle diese Funktionen machen das gleiche, sie =C3=B6ffnen 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=C3=BCck zu geben. Lediglich im Fall 5 ist es m=C3=B6glich das der file-handle offen zur=C3=BC= ck bleibt und dann nicht mehr erreichbar ist, vorausgesetzt man vergisst die Zeile mit 'os.close(f)'. Fun Fact: Wenn das File-Objekt gel=C3=B6scht wird, schlie=C3=9Ft es die Dat= ei wenn n=C3=B6tig. Und gel=C3=B6scht wird das Objekt entweder weil es mit 'de= l' gel=C3=B6scht 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 =C3=BCbrigens daf=C3=BCr, das die Datei geschlossen wird egal was f=C3=BCr 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=C3=BCgen sollten. > Sicher sind meine Anspr=C3=BCche an mir selber, meist zu hoch angesetzt, > doch ich beiss mich durch. Manche Probleme l=C3=B6sen sich durchs lesen > von Dokus oder durch das Mitlesen in Forum. Andere Sachen sind dann > irgendwie nicht ganz geheuer f=C3=BCr mich, wie mit dem Configpraser. Tut mir leid wenn ich da gestern (und heute?) etwas Oberlehrerhaft r=C3=BCber komme. Das will ich gar nicht. Oder meine es zumindest doch nur gut. Beim Anblick Deiner Frage hatte ich halt zwei Bef=C3=BCrchtungen (siehe Svens Vermutung): Entweder hast Du in Deiner C- und Perl-Erfahrung tats=C3=A4chlich schon so viele F=C3=A4lle von so einem Konstrukt gesehen, das Du Dir Deine Originalfrage da tats=C3=A4chlich sehr h=C3=A4ufig so stellen musst. Dann s= inken C und Perl in meinem ansehen noch tiefer und ich werde nie wieder eine Zeile davon lesen, geschweige denn schreiben. Oder Du wei=C3=9Ft es einfach noch nicht besser. Was nicht schlimm ist. Wir haben schlie=C3=9Flich alle mal angefangen. Dann ist meine Hoffnung, das Du irgendwann (m=C3=B6glichst bald!) soweit bist, das Du Code nicht nur "f=C3= =BCr Dich" sondern auch "f=C3=BCr Alle" schreibst. Und dann m=C3=B6chte ich Dir helfen, das es guter Code ist mit klaren Konzepten und eindeutigen Schnittstellen. Nicht das ich dann irgendwann =C3=BCber Code stolpere, der eine globale Variable nutzt um ein file-Objekt offen zu lassen damit ich es selber schlie=C3=9Fen muss. Oder so=E2=80=A6 > 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 =C3=BCber 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 --Sig_/PbUeV2OqDOks3bWYuDAChKF Content-Type: application/pgp-signature; name=signature.asc Content-Disposition: attachment; filename=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iF4EAREIAAYFAliBKVwACgkQtuvagsE+DE5x8gD/fbLqMxz/qFIbORTgSdR9vPl3 VK6TkuZsndbbJNMANs8A/RLDzMWTiWj61x56Aao59w7WVkq5c/QIr9mQ9QwLo4un =bvUd -----END PGP SIGNATURE----- --Sig_/PbUeV2OqDOks3bWYuDAChKF--