Seite 1 von 2

Ergebnisausgabe in Datei

Verfasst: Montag 3. Dezember 2007, 14:39
von mathi
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()
--------------------------------------------

Verfasst: Montag 3. Dezember 2007, 15:09
von sma
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.

Verfasst: Montag 3. Dezember 2007, 15:12
von CM
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

Verfasst: Montag 3. Dezember 2007, 15:21
von mathi
@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

Verfasst: Montag 3. Dezember 2007, 15:24
von CM
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?

Verfasst: Montag 3. Dezember 2007, 15:29
von mathi
Deine Antwort begreife ich nicht, ist input wirklich falsch, wenn ich eine Zahleneingabe erwarte? (siehe Edit)

Verfasst: Montag 3. Dezember 2007, 15:39
von CM
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

Verfasst: Montag 3. Dezember 2007, 15:42
von mathi
Danke für die Erklärung, Sicherheit ist bei dem Programm kein problem :-)

Verfasst: Montag 3. Dezember 2007, 16:04
von 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.

Verfasst: Montag 3. Dezember 2007, 16:20
von mathi
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()

Verfasst: Montag 3. Dezember 2007, 16:23
von Leonidas
`%f` verwenden. Dabei kannst du auf angeben wie viele Zahlen vor und nach dem Komma angezeigt werden, etwa `%0.5f`.

Verfasst: Montag 3. Dezember 2007, 16:29
von mathi
super,

vielen Dank an alle für die freundliche Hilfe :-)

Verfasst: Dienstag 4. Dezember 2007, 09:39
von mathi
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.

Verfasst: Dienstag 4. Dezember 2007, 09:49
von BlackVivi
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')
>>>

Verfasst: Dienstag 4. Dezember 2007, 10:17
von mathi
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.

Verfasst: Dienstag 4. Dezember 2007, 10:35
von BlackVivi
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

Verfasst: Dienstag 4. Dezember 2007, 10:36
von mathi
:-)

Verfasst: Dienstag 4. Dezember 2007, 11:44
von Tayce
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"

Verfasst: Dienstag 4. Dezember 2007, 11:49
von 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.

Verfasst: Dienstag 4. Dezember 2007, 12:00
von mathi
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?