Seite 1 von 1
Programmausgabe in Datei schreiben
Verfasst: Montag 9. April 2012, 18:56
von Singalun
Hallo Leute,
ich bin ein ziemlicher Python-Anfänger und auch neu hier im Forum; deshalb diese vielleicht etwas blöde frage:
Ich wollte mir die Ausgabe dieses kleinen Programms in eine Datei schreiben lassen:
Code: Alles auswählen
startzahl=input('Startzahl: ')
endzahl=input('Endzahl: ')
zahl=startzahl
while (zahl<=endzahl and zahl>=startzahl):
zahl=zahl+1
print zahl
Dazu habe ich folgendes probiert:
Code: Alles auswählen
pfad=raw_input('Pfad: ')
startzahl=input('Startzahl: ')
endzahl=input('Endzahl: ')
f=open(pfad,'w')
zahl=startzahl
while (zahl<=endzahl and zahl>=startzahl):
zahl=zahl+1
f.writelines(zahl)
print zahl
f.close
Könnt ihr mir vielleicht erklären, wie ich mein Ziel doch noch erreichen kann :K
Nette Grüße
Singalun
Re: Programmausgabe in Datei schreiben
Verfasst: Montag 9. April 2012, 19:26
von webspider
writelines schreibt eine Liste (oder besser gesagt Iterierbares wie die Fehlermeldung vermuten lässt) in Form so vieler Zeilen wie die Liste lang ist in eine Datei. Du übergibst aber eine einzelne Zahl, von daher wird das nicht funktionieren. Entweder du schreibst mit write eine Zahl nach der Nächsten (am besten zusammen mit einem Absatz) rein. Oder du erstellst eine Liste an Zahlen, die du dann per writelines in die Datei schreibst (was wohl die bessere Alternative wäre).
Oh und die Einrückung sieht etwas merkwürdig bei dir aus. Außerdem wäre es besser die Datei mit dem with-Statement zu öffnen:
Code: Alles auswählen
with open(filename, mode) as filehandle:
filehandle.writelines(numbers)
Re: Programmausgabe in Datei schreiben
Verfasst: Montag 9. April 2012, 19:51
von Singalun
Das mit der Einrückung liegt wohl daran, dass ich das aus meiner Frage auf gutefrage.net rauskopiert habe (auf die ich leider keine Antworten bekommen habe ;D)
Kannst du mir denn vielleicht erklären, wie das mit der Liste funktioniert und warum es besser ist, die Datei mit dem with statement zu öffnen?
Re: Programmausgabe in Datei schreiben
Verfasst: Montag 9. April 2012, 20:14
von Py-Prog
Also bei Windows geht das viel einfacher:
In der Konsole (Start Ausführen (XP) | oder Suchen (Vista, 7) eingeben, bzw. als batch skript speichern
Code: Alles auswählen
@echo off
skript.py > output.txt rem > überschreibt die Datei, >> hängt an
echo Fertig
pause
Das dann als filename.bat oder filename.cmd abspeichern und fertig.
Und wenn man das als exe braucht, nimmt man einfach den
Batch to Exe Converter
Re: Programmausgabe in Datei schreiben
Verfasst: Montag 9. April 2012, 20:24
von Singalun
Py-Prog hat geschrieben:Also bei Windows geht das viel einfacher:
In der Konsole (Start Ausführen (XP) | oder Suchen (Vista, 7) eingeben, bzw. als batch skript speichern
Code: Alles auswählen
@echo off
skript.py > output.txt rem > überschreibt die Datei, >> hängt an
echo Fertig
pause
Das dann als filename.bat oder filename.cmd abspeichern und fertig.
Und wenn man das als exe braucht, nimmt man einfach den
Batch to Exe Converter
Tjaaa, nur bin ich leider Gottes überzeugter Linux-Nutzer
Allerdings werd ich mir mal ne virtuelle Maschine anlegen und das ausprobieren. Wobei es mir dabei ja auch darum geht, das ganze in Python zu lernen

Re: Programmausgabe in Datei schreiben
Verfasst: Montag 9. April 2012, 20:35
von Py-Prog
Vielleicht gibt es da für Linux auch was, aber da kenn ich aber die Befehle nicht.
Wegen der Virtuellen Maschine, ich weiß nicht obs geht, aber probiers mal mit Wine.
Re: Programmausgabe in Datei schreiben
Verfasst: Montag 9. April 2012, 20:44
von Singalun
Py-Prog hat geschrieben:Vielleicht gibt es da für Linux auch was, aber da kenn ich aber die Befehle nicht.
Wegen der Virtuellen Maschine, ich weiß nicht obs geht, aber probiers mal mit Wine.
Bei wine ist das glaub ich mit den befehlen nicht so optimal gelöst. Wenn ich das so integriert machen würde wäre glaub ich crossover besser geeignet. Ich wollte aber eh ne virtuelle Maschine mit Virtualbox anlegen
Weißt du denn, wie das nur mit Python zu lösen ist?
Also wär das schon nicht so schlecht das unemuliert laufen zu lassen

Re: Programmausgabe in Datei schreiben
Verfasst: Montag 9. April 2012, 20:55
von Py-Prog
Das kann doch nicht so schwer sein:
Code: Alles auswählen
with open('filename.xxx', 'w') as varname:
varname.write()
Braucht keine close()
Und fällt mir noch ein am ende er zeile '\n' nicht vergessen, sonst hast du alle zahlen aneinander gereit.
Re: Programmausgabe in Datei schreiben
Verfasst: Montag 9. April 2012, 21:07
von Singalun
Hab ja gesagt, dass ich ein ziemlicher Anfänger in Sachen Python bin
Jetzt sieht das bei mir so aus:
Code: Alles auswählen
pfad=raw_input('Pfad: ')
startzahl=input('Startzahl: ')
endzahl=input('Endzahl: ')
zahl=startzahl
while (zahl<=endzahl and zahl>=startzahl):
zahl=zahl+1
print zahl
with open (pfad,'w') as doc:
doc.write(zahl)
Da kommt jetzt allerdings die gleiche Fehlermeldung wie ich sie ganz zu Anfang mit writeline hatte:
Code: Alles auswählen
Traceback (most recent call last):
File "/home/jan/tmp.py", line 9, in <module>
doc.write(zahl)
TypeError: argument 1 must be string or read-only character buffer, not int
Ich will nunmal keinen String sonderne ne Zahl schreiben....
Re: Programmausgabe in Datei schreiben
Verfasst: Montag 9. April 2012, 21:15
von Py-Prog
Code: Alles auswählen
pfad=raw_input('Pfad: ')
startzahl=input('Startzahl: ')
endzahl=input('Endzahl: ')
zahl=startzahl
with open (pfad,'w') as doc:
while (zahl<=endzahl and zahl>=startzahl):
zahl += 1
print zahl
doc.write(''.join((str(zahl), '\n'))
So nimmt man das her, und wieso schreibst du zahl = zahl + 1, wieso nicht zahl += 1?
Und du hast die Zahl nicht als String sondern als Zahl übergeben, das geht nicht, und du hast den zeilenumbruch vergessen ...
Re: Programmausgabe in Datei schreiben
Verfasst: Montag 9. April 2012, 21:28
von webspider
Da du das with-statement in die Schleife getan hast, würde folgender Code (wenn er denn tatsächlich laufen würde) bei jedem Durchlauf die Datei neu erstellen und so den vorigen Inhalt überschreiben. D.h. In der Datei würde nur die letzte Zahl stehen.
-> Pack die Schleife und den restlichen Kram in den with-Block. Oder noch besser: Erstelle erst einmal eine Liste mit allen Zahlen und packe danach einen with-Block, der die Liste einmal in deine Datei schreibt.
Was die Fehlermeldung angeht: Du schreibst keinen String in die Datei. Konvertiere die Zahl vorher also mit str(number).
@Py-Prog: Wieso überprüfst du immer noch bei jedem Durchgang ob die Zahl größer als die Startzahl ist? Sowas würde zu Beginn der Schleife Sinn machen (à la "Die Startzahl ist größer als die Endzahl"), aber doch nicht bei jedem Durchlauf. str.join(list) ist für Listen gedacht, es für einen Einzelstring zu nutzen ist sinnlos, da reicht str() vollkommen aus. Und wie gesagt, es wäre wesentlich besser eine Liste zu erstellen (wofür ja bei dem Fall ein range-Objekt vollkommen ausreichen würde) und die dann in die Datei zu schreiben statt die Datei vorher zu öffnen und Zeile für Zeile zu schreiben.
Re: Programmausgabe in Datei schreiben
Verfasst: Montag 9. April 2012, 21:31
von Singalun
Vielen Dank, mit nem Haufen von angehängten Klammern läuft's
Sorry wenn ich etwas schwer von Begriff war aber ich kannte diese with Funktion überhaupt noch gar nicht

Re: Programmausgabe in Datei schreiben
Verfasst: Montag 9. April 2012, 21:34
von Singalun
webspider hat geschrieben:Da du das with-statement in die Schleife getan hast, würde folgender Code (wenn er denn tatsächlich laufen würde) bei jedem Durchlauf die Datei neu erstellen und so den vorigen Inhalt überschreiben. D.h. In der Datei würde nur die letzte Zahl stehen.
-> Pack die Schleife und den restlichen Kram in den with-Block. Oder noch besser: Erstelle erst einmal eine Liste mit allen Zahlen und packe danach einen with-Block, der die Liste einmal in deine Datei schreibt.
Was die Fehlermeldung angeht: Du schreibst keinen String in die Datei. Konvertiere die Zahl vorher also mit str(number).
@Py-Prog: Wieso überprüfst du immer noch bei jedem Durchgang ob die Zahl größer als die Startzahl ist? Sowas würde zu Beginn der Schleife Sinn machen (à la "Die Startzahl ist größer als die Endzahl"), aber doch nicht bei jedem Durchlauf. str.join(list) ist für Listen gedacht, es für einen Einzelstring zu nutzen ist sinnlos, da reicht str() vollkommen aus. Und wie gesagt, es wäre wesentlich besser eine Liste zu erstellen (wofür ja bei dem Fall ein range-Objekt vollkommen ausreichen würde) und die dann in die Datei zu schreiben statt die Datei vorher zu öffnen und Zeile für Zeile zu schreiben.
Ok ok, ich habe noch viel zu lernen

Re: Programmausgabe in Datei schreiben
Verfasst: Montag 9. April 2012, 21:42
von webspider
Du könntest bei der Gelegenheit ja das offizielle Tutorial durcharbeiten.
Re: Programmausgabe in Datei schreiben
Verfasst: Montag 9. April 2012, 21:46
von Singalun
webspider hat geschrieben:Du könntest bei der Gelegenheit ja das offizielle Tutorial durcharbeiten.
Ja, das wollte ich sowieso mal in Angriff nehmen

... Aber dafür ist es heute eindeutig zu spät

Re: Programmausgabe in Datei schreiben
Verfasst: Dienstag 10. April 2012, 13:35
von Py-Prog
webspider hat geschrieben:@Py-Prog: Wieso überprüfst du immer noch bei jedem Durchgang ob die Zahl größer als die Startzahl ist? Sowas würde zu Beginn der Schleife Sinn machen (à la "Die Startzahl ist größer als die Endzahl"), aber doch nicht bei jedem Durchlauf. str.join(list) ist für Listen gedacht, es für einen Einzelstring zu nutzen ist sinnlos, da reicht str() vollkommen aus. Und wie gesagt, es wäre wesentlich besser eine Liste zu erstellen (wofür ja bei dem Fall ein range-Objekt vollkommen ausreichen würde) und die dann in die Datei zu schreiben statt die Datei vorher zu öffnen und Zeile für Zeile zu schreiben.
Und wenn man ein range-Objekt her nimmt braucht man keine schleife mehr, und dann wird er beim nächsten mal den gleichen Fehler wieder machen. Also macht es sinn erst mal das so um die schleife zu bauen, und danach das mit range ect. zu machen.
Re: Programmausgabe in Datei schreiben
Verfasst: Dienstag 10. April 2012, 15:47
von nomnom
Tjaaa, nur bin ich leider Gottes überzeugter Linux-Nutzer

Funktioniert "unter Linux" genauso: (Genau genommen unter allen mir bekannten Unixshells (Abkömmlinge der Bourne-Shell).)