Ergebnisausgabe in Datei

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.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Hallo,
ich möchte Variablen in der unteren Form in eine Datei ausgeben.
natürlich geht`s so nicht weil die Ausgabe aus einem String bestehen muß, ich habe aber nach langem Suchen keine Möglichkeit gefunden, wäre aber über Hilfe sehr dankbar.


-----------------------------------
print "Hello World"
p=input("Eingabewert= ")
a=3
c=a+p
print c
f=open("foo.txt","w+") # öffne im upatemodus
f.write ("Eingabewert=",p,"mm")
f.write ("Ergebnis=",c,"mm")
f.close()
--------------------------------------------
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Suchst du sowas?

Code: Alles auswählen

print "3+4=%i" % (3+4)
Du kannst übrigens auch mit print in eine Datei schreiben, siehe letzen Absatz der Doku zu print.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi,

Code: Alles auswählen

p=raw_input("Eingabewert= ")
c=int(p) + 3
f=open("foo.txt","w+") # öffne im upatemodus
f.write ("Eingabewert = %d mm\n" % p)
f.write ("Ergebnis = %d mm" % c)
f.close()
Dazu schau Dir mal an was im Tutorial und Ausgabeformatierung steht. Hier habe ich einfach mal p in eine ganze Zahl umgewandelt und drei addiert. Das '%d' fügt nun eine solche Zahl in einen String ein.

edit: Außerdem input zu raw_input (einfach mal das Forum durchsuchen zur Frage warum - es gibt recht viele Einträge ...)

Gruß,
Christian
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

@CM

Dein Code liefert bei mir:
>>>
Eingabewert= 1
Traceback (most recent call last):
File "e:/Eigene Dateien/Bauwesen/Python/speichern1.py", line 7, in <module>
f.write("Eingabewert = %d mm\n" % p)
TypeError: int argument required

Edit:
Dummes Mißverständnis oder? Ich wollte ja eine Zahl als Eingabewert, deshalb auch input und nicht raw_input
Zuletzt geändert von mathi am Montag 3. Dezember 2007, 15:28, insgesamt 2-mal geändert.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Ja, sorry. War nicht getestet. Weißt Du warum da ein Fehler kommt? Zwar wird geschieht eine Umwandlung von p bevor die 3 addiert wird, aber p selber verändert sich nicht.
Hilft das?
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Deine Antwort begreife ich nicht, ist input wirklich falsch, wenn ich eine Zahleneingabe erwarte? (siehe Edit)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Nein, natürlich nicht. Aber input() hat so seine Haken:

Code: Alles auswählen

input(...)
    input([prompt]) -> value
    
    Equivalent to eval(raw_input(prompt)).
D. h. für Dich, wenn Du wirklich nichts Anderes machen willst, ist das ok. Aber sonst kannst Du Dir Sicherheitslücken einbauen.

Gruß,
Christian
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Danke für die Erklärung, Sicherheit ist bei dem Programm kein problem :-)
BlackJack

Sicherheit ist immer ein Problem wenn man sich erst einmal an `input()` gewöhnt weil's so schön einfach ist, hat man das früher oder später auch in wichtigem Quelltext oder es gelangt per copy'n'paste aus "unwichtigem" Quelltext in ein wichtiges Programm.

Ab Python 3.0 verhält sich `input()` dann auch wie `raw_input()`, da kann man also jetzt schon den sauberen Weg lernen und verwenden.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

ok verstanden, wie krieg ich es hin, dass ich float zahlen in die Datei schreiben kann?

bei mir siehts jetzt so aus:


p=eval(raw_input("Eingabewert= "))
c=p+3.21
print c
f=file("foo.txt","w") # öffne im upatemodus
f.write("Eingabewert = %d mm\n" % p)
f.write("Ergebnis = %d mm" % c)
f.close()
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

`%f` verwenden. Dabei kannst du auf angeben wie viele Zahlen vor und nach dem Komma angezeigt werden, etwa `%0.5f`.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

super,

vielen Dank an alle für die freundliche Hilfe :-)
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

kleiner Nachbrenner:
--------------------------------

Code: Alles auswählen

from __future__ import division

#p=eval(raw_input("Eingabewert= ")) 
p=1
c=p/3  
print ("text=", round(c,3), "kn")
-------------------------------------
warum funktioniert das runden nicht?


ich weiß, dass :
print ("text = %0.3f kn\n" % c)

möglich ist, mir gehts darum - es zu verstehen.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Was is'n das Traceback oO' Bei mir geht's.

Code: Alles auswählen

>>> from __future__ import division
>>> p = 1
>>> c = p / 3
>>> c
0.33333333333333331
>>> round(c,3)
0.33300000000000002
>>> print "text =", round(c, 3), "kn"
text = 0.333 kn
Übrigens:

1. Python-Code richtig im Forum anzeigen lassen.
2. PEP8 (Styleguide für Python, ganz wichtig oO! Wirklich!!! WIRKLICH!!!)
3. Print benötigt keine Klammern.

Edit: Achso, weil du geklammert hast. Print denkt dann es is'n Tuple, schau:

Code: Alles auswählen

>>> type (("text =", round(c, 3), "kn"))
<type 'tuple'>
Print wandelt es automatisch in'n Tuple um, round wird dann nicht korrekt angewendet:

Code: Alles auswählen

>>> foo = ("text =", round(c, 3), "kn")
>>> foo
('text =', 0.33300000000000002, 'kn')
>>>
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Testforum geht grad net, muß ich`s so versuchen:

Code: Alles auswählen

#p=eval(raw_input("Eingabewert= ")) 
p=1
c=p/3  
print "text=", round(c,3), "kn"

print c
print ("Eingabewert = %0.2f mm\n" % c)

f=file("foo.txt","w") # öffne im upatemodus 
f.write("text="+`round(c,3)`+"kn") 
f.write("Ergebnis = %0.3f mm" % c) 
f.close()
Danke erstmal, hattest Recht -aber:
warum funktioniert das in der write() Anweisung dann nicht?
Am Ende möchte ich für print und write die gleiche Art verwenden, um besser kopieren zu können.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

mathi hat geschrieben:Am Ende möchte ich für print und write die gleiche Art verwenden, um besser kopieren zu können.
Kopieren ist immer doof ;P Nur Spaß... Naja, Print is'n Statement, write'ne Funktion. In Python 3000 wird's sich ändern :3
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

:-)
Tayce
User
Beiträge: 56
Registriert: Sonntag 22. April 2007, 18:26
Wohnort: München
Kontaktdaten:

in python 3000 wird doch print auch zur ner funktion... also

Code: Alles auswählen

print ("so geht das dann") 
#statt
print "so geht das jetz"
Jabber: tayce@jaim.at
BlackJack

@mathi: OMG wie bist Du denn auf die Backticks gekommen? Die sollte man nicht verwenden. Sie sind leicht zu übersehen, in manchen Schriftarten sehen sie aus wie normale, einfache Anführungsstriche ('), und sie sind schon seit Ewigkeiten "deprecated". Sie bewirken das gleiche wie die `repr()`-Funktion. Allerdings kann man das auch mit Zeichenkettenformatierung hinbekommen:

Code: Alles auswählen

f.write("text=%r kn\n" % round(c, 3))
Letztendlich kann man das Runden aber auch mit '%.3f' als Platzhalter für die Formatierung machen. Die `round()`-Funktion bietet sich eher an, wenn man mit dem gerundeten Wert weiter rechnen möchte.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

die Backticks habe ich aus einem Tutorial :oops:

also würde ich folgendermaßen schreiben:

Code: Alles auswählen

print('fcd= %0.2f N/mm^2' % fcd)

sichern.write('fcd=%0.2f N/mm^2\n' % fcd)

 # bzw.

sichern.write('fcd='+repr(fcd)+' N/mm^2\n')  # ohne Rundung

richtig?
Antworten