"file.write(...)" in einer while-Schleife

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
Benutzeravatar
lucanello
User
Beiträge: 15
Registriert: Freitag 11. Juli 2014, 13:05
Kontaktdaten:

Hallo ihr Progammierer.

Ich habe mir vor Kurzem einen Raspberry Pi zugelegt und habe sofort angefangen mein eigenes kleines Programm zu schreiben, in welchem beliebig viele Zufallszahlen generiert werden sollen.
Nun wollte ich aber jede Zahl in ein .txt File schreiben und diese per Zeilenumbruch abtrennen, jedoch ist mir das noch nicht gelungen. Ich bekomme es zwar hin, dass eine Zufallszahl in ein .txt File geschrieben wird, jedoch wird diese dann immer von der nächsten überschrieben..
Hier mal der Code, ich hoffe ihr könnt damit was anfangen! :)

Code: Alles auswählen

import os
os.system("clear")
import sys
from termcolor import colored
i = input(colored('How many Codes to generate? ', 'red'))
print ''
n = 0
x = ''
while (n < i):
        import random
        #print str(random.randrange(0,9999999))
        x = random.randrange(0,99999999)
        print x
        file = open("generatedcodes.txt", "w")
        file.write(str(x) + "\n")
        file.close()
        n = n + 1
        print colored('Codes generated: ', 'red'),
        print colored(n, 'magenta')
        import time
        time.sleep(.8)
        #n = n +1
        #print colored('Codes generated: ', 'red'), 
        #print colored(n, 'magenta')
print colored('____________________________', 'green')
print colored('Codes successfully generated', 'green')
print ''
print ''
Wie bekomme ich es hin, dass am Ende jeder Code in einer neuen Zeile steht?
Zusätzliche Frage (was ich auch noch vor hatte): Wie kann ich den User bestimmen lassen, wie viele Zeichen der Code haben soll?


Ich hoffe ihr könnt mir weiterhelfen :)
Danke im Voraus!
MfG Luca
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hallo,

Du öffnest, schreibst und schließt in *jedem* Schleifendurchlauf die Datei! Spiel das mal von Hand nach ;-) Es ist doch logisch, dass so die vorangegangene Datei durch eine neue überschrieben wird.

Du darfst die Datei nur *einmal* zum Schreiben öffnen, dann erzeugst Du die Zufallszahlen und schreibst diese Zeile für Zeile in die Datei und am Schluss schließt Du die Datei dann wieder.

Glücklicher Weise kannst Du Dir den letzten Schritt sparen, wenn Du Dateien idiomatisch korrekt öffnest:

Code: Alles auswählen

with open(...) as f:
    # f ist in diesem Block das offene File-Objekt
    # Schließen nach dem Block braucht man f nicht
    # man sollte einen besseren Namen als f wählen ;-)
Wenn Du Python 2.x benutzt, verwende ``raw_input`` für Benutzereingaben, bei Python 3.x verwende ``input``. Beide Male musst Du daran denken, die Eingabe von einem String in einen Integer-Wert zu wandeln (``int(s)``).

Wenn man die Anzahl der Durchläufe einer Schleife kennt, so sollte man eigentlich ``for`` wählen. Also so z.B.:

Code: Alles auswählen

for count in range(times):
    # tu was

# oder eleganter:
for count in itertools.count(times):
    # tu was
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
lucanello
User
Beiträge: 15
Registriert: Freitag 11. Juli 2014, 13:05
Kontaktdaten:

Vielen Dank, es hat geklappt!

Habe nun versucht es möglich zu machen, dass der User selbst bestimmen kann, wie lang der Code sein soll.
Ich habe es nun auf die aufwendige Art probiert, indem ich in einem externen Code-Snippet einlese:

Code: Alles auswählen

if c == 1:        #c ist die Variable, welche vom User selbst eingegeben werden muss.
   u = 0
   v = 9
if c == 2:
   u = 0
   v = 9
Nun habe ich jedoch das Problem, dass u bzw. v nicht deklariert ist, wie mach ich das?
Mit u = 0 und v = 9 am Anfang scheint es nicht zu funktionieren.

Gibt es ansonsten eine edlere und leichtere Variante dieses Problem zu lösen?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Was genau klappt denn nicht? Wie genau lautet die Fehlermeldung? Zeig uns den dazugehörigen Code - wenigstens vollständig bezüglich der gesamten Passage - von Benutzereingabe sieht man da noch nichts!

Deine Namen sind *doof*! Was bedeuten denn ``u`` und ``v``? Kannst Du das in einem Monat noch sagen? ;-) Gib den Variablen *sprechende* Name, die aussagen, was sich dahinter verbirgt.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
lucanello
User
Beiträge: 15
Registriert: Freitag 11. Juli 2014, 13:05
Kontaktdaten:

Die Variablen würde ich eher mit Kommentaren angeben, da ich keine kurzen englischen Wörter für die jeweiligen Variablen habe.
Der Fehlercode ist:

Code: Alles auswählen

Traceback (most recent call last):
   File "codegenerator.py", line 16, in <module>
   x = random.randrange(u,v)
NameError: name 'u' is not defined
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

lucanello hat geschrieben:Die Variablen würde ich eher mit Kommentaren angeben, da ich keine kurzen englischen Wörter für die jeweiligen Variablen habe.
Falscher Ansatz! Zur Not suche Dir Begriffe mittels eines Lexikons. Du suchst hier z.B. ``upper_bound`` und ``lower_bound`` (in kurz nur ``lower`` und ``upper``) oder auch ``start`` und ``end`` usw.

Alles besser als ``u`` und ``v`` - die ja für *nichts* stehen ;-)

Du musst uns schon den Code drum herum zeigen! So sehen wir ja nicht, *wieso* die beiden Namen an der Stelle unbekannt sind.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
lucanello
User
Beiträge: 15
Registriert: Freitag 11. Juli 2014, 13:05
Kontaktdaten:

Ich habe mein externes File per

Code: Alles auswählen

file = open("codelength.txt", "r")
eingebunden in welchem das steht:

Code: Alles auswählen

u = 0
v = 9
if c == 1:
        u = 0
        v = 9
        print Length 1
if c == 2:
        u = 10
        v = 99
        print Length 2
if c == 3:
        u = 100
        v = 999
        print Length 3
if c == 4:
        u = 1000
        v = 9999
        print Length 4
Die Prints habe ich nur zum Überprüfen benutzt, ob das File überhaupt eingebunden wird.
Jedoch spuckt er mir nun aus, dass die Variablen nicht definiert sind, was aber durch die if-Abfragen geschehen sollte.

Gäbe es eventuell ein "umgekehrtes" len(), dass man nicht die Läge ausliest sondern angibt?
BlackJack

@lucanello: Man kann nicht einfach so eine Textdatei mit Python-Quelltext öffnen und hoffen deren Inhalt wird dann einfach so Teil des Programms. So eine Art ”include” von Code ist in Python sowieso nicht vorgesehen. Letztendlich versuchst Du hier aber auch recht einfache *Daten* als Quelltext auszudrücken. Das würde man normalerweise als Datendatei machen, die dann vom Quelltext eingelesen und entsprechend verarbeitet wird. Also zum Beispiel eine Liste im JSON-Format, die dann mit Hilfe des JSON-Moduls aus der Standardbibliothek eingelesen wird und die entweder JSON-Objekte als Elemente enthält mit zwei Schlüssel/Wert-Paaren, oder Listen mit jeweils zwei Elementen für die beiden Werte.

Das die Variablennamen nix taugen wurde glaube ich schon mal erwähnt, oder. ;-)

Was hättest Du eigentlich bei so einem ``print`` dort erwartet was da passiert? Was tatsächlich passiert wenn das im Quelltext so stehen würde, ist ein Syntaxfehler.
Benutzeravatar
lucanello
User
Beiträge: 15
Registriert: Freitag 11. Juli 2014, 13:05
Kontaktdaten:

Ich wollte den "Riesencode" nicht in meinen Hauptcode reinschreiben, ansonsten wäre das zu unübersichtlich geworden (50 Stellen soll der Code haben).
Mir ist auch gerade eben erst aufgefallen, dass die Gänsefüßchen fehlen, danke für den Hinweis ;)
Ehrlich gesagt wäre es mir lieber, eine andere Lösung zu finden, wie ich die Code-Länge definieren kann.
BlackJack

@lucanello: Soll `c` die Anzahl der Ziffern in den erzeugen Codes angeben und von 1 bis 50 alles möglich sein? Dann ist das alles andere als ein Riesencode, denn man kann die Unter- und Obergrenze aus dem Wert von `c` *berechnen*. Da muss man nicht 50 ``if``-Zweige für schreiben.

Edit:

Code: Alles auswählen

In [11]: for c in xrange(1, 10):
   ....:     print 10**(c - 1), 10**c - 1
   ....: 
1 9
10 99
100 999
1000 9999
10000 99999
100000 999999
1000000 9999999
10000000 99999999
100000000 999999999
Wie man sieht braucht man nur für ``c == 1`` für die Untergrenze eine Sonderbehandlung.
Benutzeravatar
lucanello
User
Beiträge: 15
Registriert: Freitag 11. Juli 2014, 13:05
Kontaktdaten:

Vielen Dank für den weiteren Lösungsweg!
Jedoch spuckt er mir hier einen Syntax Fehler aus:

Code: Alles auswählen

File "codegenerator.py", line 12
    In [11]: for c in xrange(1, 10):
           ^
SyntaxError: invalid syntax
Ich habe den Code von Dir einfach reinkopiert um zu sehen, ob es funktioniert, da ich selber nicht weiß, was die einzelnen Funktionen bewirken.
Wie funktionieren die einzelnen Befehle?
Könnte mir jemand bei dem Einbinden helfen?
BlackJack

@lucanello: Ich habe das in eine interaktive Python-Shell eingegeben, das kann man nicht 1:1 in eine Quelltextdatei kopieren.

Ansonsten ist das einzig neue wohl der ``**``-Operator. Das ist der Potenzoperator.
Benutzeravatar
lucanello
User
Beiträge: 15
Registriert: Freitag 11. Juli 2014, 13:05
Kontaktdaten:

Aaaach der erstellt einfach die Zahlen.
Wie binde ich die nun in den Quellcode ein? Wenn sie mir geprintet werden, nutzt es mir nicht allzu viel, wie deklariere ich nun die Random-Variablen, damit sie den Wert dieser "Zahlenpyramide" annehmen?
Benutzeravatar
lucanello
User
Beiträge: 15
Registriert: Freitag 11. Juli 2014, 13:05
Kontaktdaten:

Habe das Problem nach weiterer "Durchforstung" gefunden!
Funktioniert jetzt prima, gibt nun Buchstaben mit Zahlen vermischt aus, perfekt für Passwörter.
Wer das Programm bzw. ein .txt-File mit Passwörtern haben will, darf mich gerne kontaktieren :)
/close
Antworten