Programmausgabe in Datei schreiben

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.
Antworten
Singalun
User
Beiträge: 8
Registriert: Montag 9. April 2012, 18:48

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
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

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)
Singalun
User
Beiträge: 8
Registriert: Montag 9. April 2012, 18:48

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?
So, also eigenltich müsste jetzt alles funktionieren...

NEEEEEEEEEEEEEEEIN!!!!!!!!!!!!!!!!!!
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Also bei Windows geht das viel einfacher:

Code: Alles auswählen

skript.py > output.txt
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
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Singalun
User
Beiträge: 8
Registriert: Montag 9. April 2012, 18:48

Py-Prog hat geschrieben:Also bei Windows geht das viel einfacher:

Code: Alles auswählen

skript.py > output.txt
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 :mrgreen:

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 :D
So, also eigenltich müsste jetzt alles funktionieren...

NEEEEEEEEEEEEEEEIN!!!!!!!!!!!!!!!!!!
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

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.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Singalun
User
Beiträge: 8
Registriert: Montag 9. April 2012, 18:48

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 :mrgreen:

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 :D
So, also eigenltich müsste jetzt alles funktionieren...

NEEEEEEEEEEEEEEEIN!!!!!!!!!!!!!!!!!!
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

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.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Singalun
User
Beiträge: 8
Registriert: Montag 9. April 2012, 18:48

Hab ja gesagt, dass ich ein ziemlicher Anfänger in Sachen Python bin :D

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....
So, also eigenltich müsste jetzt alles funktionieren...

NEEEEEEEEEEEEEEEIN!!!!!!!!!!!!!!!!!!
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

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 ...
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

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.
Singalun
User
Beiträge: 8
Registriert: Montag 9. April 2012, 18:48

Vielen Dank, mit nem Haufen von angehängten Klammern läuft's :D

Sorry wenn ich etwas schwer von Begriff war aber ich kannte diese with Funktion überhaupt noch gar nicht :D
So, also eigenltich müsste jetzt alles funktionieren...

NEEEEEEEEEEEEEEEIN!!!!!!!!!!!!!!!!!!
Singalun
User
Beiträge: 8
Registriert: Montag 9. April 2012, 18:48

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 :mrgreen:
So, also eigenltich müsste jetzt alles funktionieren...

NEEEEEEEEEEEEEEEIN!!!!!!!!!!!!!!!!!!
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Du könntest bei der Gelegenheit ja das offizielle Tutorial durcharbeiten.
Singalun
User
Beiträge: 8
Registriert: Montag 9. April 2012, 18:48

webspider hat geschrieben:Du könntest bei der Gelegenheit ja das offizielle Tutorial durcharbeiten.
Ja, das wollte ich sowieso mal in Angriff nehmen :oops: ... Aber dafür ist es heute eindeutig zu spät :D
So, also eigenltich müsste jetzt alles funktionieren...

NEEEEEEEEEEEEEEEIN!!!!!!!!!!!!!!!!!!
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

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.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Tjaaa, nur bin ich leider Gottes überzeugter Linux-Nutzer :mrgreen:
Funktioniert "unter Linux" genauso: (Genau genommen unter allen mir bekannten Unixshells (Abkömmlinge der Bourne-Shell).)

Code: Alles auswählen

python skript.py > ausgaben.txt
Antworten