String in Textdatei 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
pauli_fc
User
Beiträge: 7
Registriert: Mittwoch 18. August 2010, 10:30

Hallo,

bin gerade dabei Python zu lernen. Ich habe ein Programm geschrieben, das mir Lottoreihen ausgibt. Diese Reihen sollen in eine Textdatei geschrieben werden, damit man sie ausdrucken kann. Das funktioniert soweit ganz gut, nur werden die Reihen alle nacheinander weg in die Datei geschrieben. Also so [1,2,5,4,6,7] [7,49,2,7,4,16] etc.
Ich würde aber gerne jeden Zahlenblock untereinander stehen haben. Außerdem wäre es schön, wenn vor jedem Block sowas wie "Reihe 1:" etc stehen würde. Das ist mir bisher auch nicht gelungen...

edit: ok, das mit der Reihenbezeichnung hab ich geschafft - fehlt noch diese hintereinander-Reihung wegzubekommen :K
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Schau Dir mal "7.1.2 String Formatting" (http://docs.python.org/library/string.h ... formatting) und "7.1.3. Format String Syntax" (http://docs.python.org/library/string.h ... ing-syntax) in der Python-Dokumentation an. Da findest Du sicher etwas.
https://www.xing.com/go/invite/18513630.6a91d4
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Zeig doch mal was du bisher hast.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
pauli_fc
User
Beiträge: 7
Registriert: Mittwoch 18. August 2010, 10:30

Code: Alles auswählen

import random
x = 1
while x <= 4:         
 random.seed()
 count = 0
 numberlist = []
 while (count < 6):
    temp = random.randint(1,49)
    if (numberlist.count(temp) == 0):
        numberlist.append(temp)
        count = count + 1
 numberlist.sort()
 print numberlist

 string1 = str(numberlist)             
 string2 = str(x)
 
 workspace = r"c:\Dokumente und Einstellungen\..."    # Pfad eintragen, wo Datei gespeichert werden soll
 f = open("lottozahlen.txt", "a")
 f.write('Block ')
 f.write(string2)
 f.write(': ')
 f.write(string1)
 f.close()
 x = x + 1
rads
User
Beiträge: 153
Registriert: Freitag 26. März 2010, 15:51

Ein f.write('\n') würde reichen.
\n steht für newline bzw. linebreak.

Ich denke Optimierunsanregungen kommen hier auch noch bald.
BlackJack

@pauli_fc: Du solltest vier Leerzeichen pro Einrückebene verwenden. Eines ist eindeutig zu wenig, das sieht man ja kaum. Die Einrückungung soll ja nicht nur dem Compiler sagen was zusammengehört, sondern auch Menschen das Lesen erleichtern.

Wenn man vor Eintritt in eine Schleife schon weiss wie oft sie durchlaufen wird, ist eine ``for``-Schleife vorzuziehen.

`random.seed()` aufzurufen ist unnötig. Das wiederholte Aufrufen kann das Ergebnis sogar *weniger* zufällig machen, also weg damit.

Klammern um Bedingungen sind in Python nicht nötig und deswegen auch unüblich.

Statt zu zählen wie oft die gezogene Zahl in der Liste vorkommt, könntest Du auch einfach mit dem ``in``-Operator testen ob sie vorkommt.

`count` hat am Anfang jedes Schleifendurchlaufs der inneren ``while``-Schleife immer den gleichen Wert wie die Länge der Liste. Da braucht man also keine extra Variable für.

`string1` und `string2` sind schlechte Namen. Die sagen nichts darüber aus welche *Bedeutung* die Werte haben, die daran gebunden werden. *Das* ist aber das eigentlich Interessante für den Leser von Quelltext. Man sollte konkrete Typinformationen möglichst aus Namen heraushalten. Das gilt auch für den `list`-Zusatz bei `numberlist`. Wenn man irgendwann einmal entscheidet aus der Liste zum Beispiel ein `set` zu machen, dann muss man entweder die Namen überall ändern, oder man hat Namen die nicht mehr zum Programm passen.

`workspace` wird nicht verwendet. Weg damit.

Die Zeichenkette könnte man in einem `write()`-Aufruf schreiben wenn man sie mit Zeichenkettenformatierung zusammensetzt. Also mit dem ``%``-Operator oder der `format()`-Methode auf Zeichenketten. Dann würde man auch `string1` und `string2` los.

Alternativ könne man die Lottozahlen auch ermitteln indem man alle Zahlen mischt und dann die ersten 6 davon nimmt. Schau mal was es im `random`-Modul noch so an Funktionen gibt.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Man kann auch direkt 6 Ziffern aus einer Liste von Zahlen ziehen. Dafür gibt's im "random"-Modul ebenfalls eine Funktion.

Grüße
Gerrit
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Noch ein Tipp:

Code: Alles auswählen

with open("lottozahlen.txt", "a") as f:
    print >>f, "Block %d: %s" % (x, numberlist)
Stefan
Antworten