String aus Textdatei lesen und anschliessend manipulieren

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.
deets

problembär hat geschrieben:einbaut.
Es ist schon ein Problem, wenn man Programme stets in der allerneuesten Syntax schreibt.
Mit 2.4 kann ich nur noch die wenigsten Anwendungen nutzen. Hab' neulich z.B. probiert, [url=p://mypaint.intilinux.com]MyPaint[/url] zu installieren. Geht nicht. Wie fast alles.
Man erreicht also nur sehr wenige Leute, wenn man die neueste Syntax nutzt. Nicht jeder, der eine Python-Anwendung startet, hält sein Python-System stets auf dem neuesten Stand. Das wird bei der Vielzahl der Module wohl nur eine ganz geringe Minderheit tun.[/quote]

Abgesehen davon, dass du fuer deine Behauptungen keine Belege bringst - Python 2.5 (und damit die Verwendbarkeit von with) ist seit September 2006 released. Da zieht dann auch nicht das "alle 2-3 Jahre nen neuen Rechner kaufen"-Argument. Welches eh Bloedsinn ist, denn bis dato sind eigentlich alle Python-Versionen selbst schneller geworden als der Vorgaenger - d.h. je aelter der Rechner, desto sinnvoller zu upgraden.

Also, was du dir wirklich sparen kannst ist dein sinnloser Versuch, deine mangelnde Kenntnis in Python und den Unwillen, daran etwas zu aendern, als sinnvolle, gut begruendete Haltung zu verkaufen.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

problembär hat geschrieben:
EyDu hat geschrieben:
problembär hat geschrieben:Hmm, hatte da noch nie Probleme. Wie sollte man das denn ausschließen?
Du fängst zum Beispiel keine Exceptions ab, die beim Lesen der Daten auftreten können. Das bedeutet, dass die Datei in einem Fehlerfall nicht richtig geschlossen wird. In älteren Versionen muss das Lesen und Schreiben von einem try/except-Block umschlossen sein.
Hmm, wenn es beim Lesen einen Fehler gibt, will ich doch, daß das Programm abbricht und eine Fehlermeldung ausgibt. Das macht es doch gerade, wenn ich den Fehler nicht abfange.
Natürlich werden dabei nicht die Fehler verschluckt sonder dafür gesorgt, dass die Datei ordnungsgemäß geschlossen wird. Das ich mich hier etwas undeutlich ausgedrückt habe ist unglücklich, deine Anmerkung macht aber deutlich, dass du das with-Statement überhaupt nicht richtig verstanden hast.
problembär hat geschrieben:Beim Abbruch des Python-Skripts stürzt ja nicht der Interpreter mit ab. Sondern er wird dann sicherlich noch offene Filehandles wieder schließen, bevor er sich beendet.
Dann kannst mir auch bestimmt die Stelle in der Dokumentation nennen, wo das Schließen von noch offenen Handles bei der Terminierung des Programms garantiert wird.

@Hyperion: Bei deiner "äquivalenten" Lösung ist ein wenig schief gegangen: PEP 343.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

EyDu hat geschrieben: @Hyperion: Bei deiner "äquivalenten" Lösung ist ein wenig schief gegangen: PEP 343.
Spielst Du auf das `except` an? Das kann man natürlich weglassen, wenn man ihn nicht behandeln will.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@problembär:
Wenn die Exception zum Prozessabbruch führt, kümmert sich unter Windows und Linux der Kernel selbst ums Aufräumen "vergessener" Filehandles. Allerdings sollte dieser Rettungsanker nicht dazu führen, unsauber zu programmieren. In puncto Python gibts eben nicht nur CPython mit seinem Interpreter und wie andere hier reagieren (Jython in der JVM etc.) ist fraglich. Prinzipell sollte man immer um die ordnungsgemässe Degradierung angefragter Ressourcen im eigenen Code bemüht sein. Im Falle eines Dateihandles ohne with dann eben mit Exceptionhandling.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hyperion hat geschrieben:
EyDu hat geschrieben: @Hyperion: Bei deiner "äquivalenten" Lösung ist ein wenig schief gegangen: PEP 343.
Spielst Du auf das `except` an? Das kann man natürlich weglassen, wenn man ihn nicht behandeln will.
Nein, darauf, dass das open nicht in den try-Block gehört.
Das Leben ist wie ein Tennisball.
deets

Auch nicht unerwaehnt bleiben sollte PyPy, welches inzwischen im Schnitt doppelt so schnell ist als der CPython Interpreter - und dabei unter anderem alternative Garbage Collection einsetzt, womit implizites Verhalten wie bisher nicht garantiert ist. Und das ist schon deutlich relevanter, denn PyPy kann durchaus oft als drop-in replacement genutzt werden (im Gegensatz zu Jython).
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

EyDu hat geschrieben: Nein, darauf, dass das open nicht in den try-Block gehört.
Äh... dann zeig Du mir bitte die Lösung. Ich kann mir das so nicht vorstellen!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ich hatte doch oben bereits PEP 343 verlinkt:

Code: Alles auswählen

        with EXPR as VAR:
            BLOCK
wird zu

Code: Alles auswählen

        mgr = (EXPR)
        exit = type(mgr).__exit__  # Not calling it yet
        value = type(mgr).__enter__(mgr)
        exc = True
        try:
            try:
                VAR = value  # Only if "as VAR" is present
                BLOCK
            except:
                # The exceptional case is handled here
                exc = False
                if not exit(mgr, *sys.exc_info()):
                    raise
                # The exception is swallowed if exit() returns true
        finally:
            # The normal and non-local-goto cases are handled here
            if exc:
                exit(mgr, None, None, None)
Das "open" wird, vor dem "try" ausgeführt. Sonst würde man bei einem fehlerhaften Öffnen versuchen die Datei zu schließen.
Das Leben ist wie ein Tennisball.
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

EyDu meint wohl, dass foo in deinem Beispiel (finally) nicht geschlossen werden kann, wenn eine Exception passiert. Soweit ich mich richtig erinnere musste man die try ... excepts ... verschachteln

Code: Alles auswählen

try:
    foo = open('bar')
    try:
        foo.read()
    finally:
        foo.close()
except IOError:
    # ...
Edit: knapp zu spät
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ah ... ok. Dann hab ich das wohl immer falsch gehandelt - nuja, benutze ja auch schon seit Jahren `with` :-D

Diese Antwort hatte mich jedoch eher verwirrt, als dass sie half:
EyDu hat geschrieben: Nein, darauf, dass das open nicht in den try-Block gehört.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Jaja, das waren schlimme Zeiten, als es nur try/except bzw. try/finally gab. :shock:
Das Gefummel mit verschachtelten Exceptionhandlern war nicht schön.

Praise the invention of try/except/finally and with!
nerdizzle
User
Beiträge: 3
Registriert: Dienstag 29. November 2011, 13:00

Hallo zusammen!

Ich bin überwältigt wie viel dazu geschrieben wurde, danke vielmals! Ich muss sagen, dass ich exeption handling
in Python noch nicht genau angeschaut habe, kenne es aber aus Java.

Ich habe das ganze nun so gelöst:

Code: Alles auswählen

from pylab import *

xList = []
yList = []

f = open("FunDia1.txt")

xlabel('Verkehrsdichte')
ylabel('Verkehrsfluss')



for line in f:
	line = line.rstrip()
	parts = line.split()
	xList.append(double(parts[0]))
	yList.append(double(parts[1]))
	
plot(xList,yList,'ro')
axis([0,1.2,0,0.5])
show()
Funktioniert wunderbar. Ich möchte die Daten gerne noch mit der Methode der kleinsten Quadrate fitten.
Gibt es eine Funktion, die das für einen macht?

EDIT: http://www.scipy.org/Cookbook/FittingData
diesen Link habe ich mir angeschaut, aber blicke nicht wirklich durch, darum kann ich es auch nicht implementieren ..
cheers!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

1.) Wenn schon mit einem eigenen Ansatz, wieso verwendest Du nicht ``with``? Das wurde ja gerade intensiv diskutiert...

2.) Wieso verzichtest Du auf die Funktion aus ``numpy``, die ich Dir gepostet hatte? Das wäre doch das komfortabelste...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten