Telefonnummer Generator

Code-Stücke können hier veröffentlicht werden.
Antworten
eject
User
Beiträge: 10
Registriert: Freitag 8. Januar 2016, 22:39

Hallo liebes python-forum :),

ich dachte ich hätte mal eine kleine 'Grundlage' für einen solchen 'Generator'.

Code: Alles auswählen

from random import *
import sys, os
    
a = 0
w = 0

filename = input('choose a file on desktop: ')
targetfile = open(filename, 'w')

print("|--------------------------------|")
print("|                                        |")
print("|    IRGENDEINEN TEXT         |")
print("|                                         |")
print("|--------------------------------|")
print("|VODAFONDE+++TELEKOM+++EPLUS+++O2|")
print("| 152    |   151   |   157 | 159 |")
print("| 162    |   160   |   163 | 176 |")
print("| 172    |   170   |   177 | 179 |")
print("| 173    |   171   |   178 |     |")
print("| 174    |   175   |       |     |")
print("|________________________________|")
print("")
print("")

z = '+49'

while True:
    
    print("")
    pre = input("Pre: ")
    x = int(input("How many?[integer]: "))
    print("")


    for a in range(x):
        y = randint(11111111,99999999)
        mnumber = (str(z)+str(pre)+str(y))
        print(mnumber)
        targetfile.write(mnumber)
        targetfile.write('\n')
        w += 1


    if (w > 1):
        print("")
        print("")
        print("|--------------------------------|")
        print("|                                        |")
        print("|    irgendeinen Text           |")
        print("|                                        |")
        print("|--------------------------------|")
        print("|VODAFONDE+++TELEKOM+++EPLUS+++O2|")
        print("| 152    |   151   |   157 | 159 |")
        print("| 162    |   160   |   163 | 176 |")
        print("| 172    |   170   |   177 | 179 |")
        print("| 173    |   171   |   178 |     |")
        print("| 174    |   175   |       |     |")
        print("|________________________________|")
        print("")
        print("")
Was haltet ihr davon? Muss übrigens in einer IDLE ausgeführt werden, als normale .py Datei funktioniert es bei mir nicht :roll: .

Verbesserungsvorschläge sind übrigens sehr gerne gesehen. ^^ Und noch was, ich habe mit Python vor ca 4 Tagen und 3 Stunden angefangen, also bin ich ein bisschen am Spielen damit, falls die 'wieso' Frage kommt.

Schönen Abend euch noch,

eject.
Zuletzt geändert von Anonymous am Freitag 8. Januar 2016, 23:19, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
eject
User
Beiträge: 10
Registriert: Freitag 8. Januar 2016, 22:39

Code: Alles auswählen

filename = 'mobile.number'
targetfile = open(filename, 'w')
So, jetzt funktioniert es auch als normale .py Datei. ^^
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

eject hat geschrieben:

Code: Alles auswählen

filename = 'mobile.number'
targetfile = open(filename, 'w')
So, jetzt funktioniert es auch als normale .py Datei. ^^
Auch die erste Version funktioniert. Ich nehme mal an, Du führst das Modul via Python 2 aus. Dabei erzeugt das erste `input()` tatsächlich einen Fehler, weil die `input()` Funktion unter Python 2 etwas anderes macht als unter Python 3.
Oder aber ich verstehe nicht, was Du anfangs mit '... als normale .py Datei funktioniert es bei mir nicht. gemeint hast.

Zu Deinem Code:
  1. Benutze keine Sternchenimporte. Damit holst Du Dir alle Namen aus dem importierten Modul in den Namensraum Deines Modules. Und das kann unerwünschte Effekte haben. Zudem finde ich, dass es beim Lesen von Code von Vorteil ist, wenn über das Modulprefix ersichtlich ist, woher ein Name stammt → ``randint()`` ↔ ``random.randint()``
  2. Verwende Namen, hinter denen wir, die wir Deinen Code nicht kennen und auch Du in einem halben Jahr noch verstehen, was damit gemeint ist. Stell' Dir mal ein etwas größeres Programm vor, das mit `a`, `w` und `z` hantiert. Mindestens ich müsste mir beim Lesen eine Notiz anlegen, um nicht immer wieder nachschauen zu müssen, auf was die Namen denn verweisen. Warum nicht `COUNTRY_CODE` an Stelle von `z`?
  3. Verwende Funktionen, sie sind etwas wunderbares! :wink:
  4. Öffne Dateien mit dem with statement. Damit stellst Du sicher, dass die Datei auch im Falle eines Fehlers wieder geschlossen wird.
Hier mal eine Idee von mir:

Code: Alles auswählen

import random

COUNTRY_CODE = '+49'

def write_to_file(filename, content):
    with open(filename, 'w') as file_:
        file_.write(content)

def main():
    while True:
        print("|--------------------------------|")
        print("|                                        |")
        print("|    IRGENDEINEN TEXT         |")
        print("|                                         |")
        print("|--------------------------------|")
        print("|VODAFONDE+++TELEKOM+++EPLUS+++O2|")
        print("| 152    |   151   |   157 | 159 |")
        print("| 162    |   160   |   163 | 176 |")
        print("| 172    |   170   |   177 | 179 |")
        print("| 173    |   171   |   178 |     |")
        print("| 174    |   175   |       |     |")
        print("|________________________________|")
        print("")
        print("")
        filename = input('Filename: ')
        prefix = input('Prefix: ')
        runs = int(input('How many mobile numbers to create? '))
        template = '{}{}{{phone_number}}\n'.format(COUNTRY_CODE, prefix)
        mobile_numbers = [template.format(
            phone_number=random.randint(11111111, 99999999)
        ) for _ in range(runs)]
        write_to_file(filename, ''.join(mobile_numbers))
        vote = input('Once more again (y/n)? ')
        if vote in 'nN':
            break

if __name__ == '__main__':
    main()
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
eject
User
Beiträge: 10
Registriert: Freitag 8. Januar 2016, 22:39

Guten Mittag :D

Dankeschön für die Verbesserung und auch die Ansätze! ^^

Ich verwende Python 3.5.0, zumindest die IDLE davon. Ich schau mir gleich mal an, inwiefern sich da der input() Befehl unterscheidet.
Das mit den Funktionen, muss ich noch spitz kriegen :mrgreen: . Zusätzlich, hatte ich bei meinem ursprünglichen Quellcode tatsächlich Kommentare für alles hinzugefügt nur hier nicht genannt, durch meine etwas schlechte Englische Grammatik ;D (Ja Englisch, nicht Deutsch). Du hast Recht, es macht mehr Sinn Variablen besser und informierender zu deklarieren, für die Nachwelt, sowohl auch für Andere. Das mit dem "from blabla import *" ist auch bedürftig, da werde ich mal gleich das entsprechende Modul hinterschreiben, statt "*". Danke danke für deine Hilfe :) Schönen Samstag Nachmittag wünsche ich dir noch.

Mfg,

eject.


mutetella hat geschrieben:
eject hat geschrieben:

Code: Alles auswählen

filename = 'mobile.number'
targetfile = open(filename, 'w')
So, jetzt funktioniert es auch als normale .py Datei. ^^
Auch die erste Version funktioniert. Ich nehme mal an, Du führst das Modul via Python 2 aus. Dabei erzeugt das erste `input()` tatsächlich einen Fehler, weil die `input()` Funktion unter Python 2 etwas anderes macht als unter Python 3.
Oder aber ich verstehe nicht, was Du anfangs mit '... als normale .py Datei funktioniert es bei mir nicht. gemeint hast.

Zu Deinem Code:
  1. Benutze keine Sternchenimporte. Damit holst Du Dir alle Namen aus dem importierten Modul in den Namensraum Deines Modules. Und das kann unerwünschte Effekte haben. Zudem finde ich, dass es beim Lesen von Code von Vorteil ist, wenn über das Modulprefix ersichtlich ist, woher ein Name stammt → ``randint()`` ↔ ``random.randint()``
  2. Verwende Namen, hinter denen wir, die wir Deinen Code nicht kennen und auch Du in einem halben Jahr noch verstehen, was damit gemeint ist. Stell' Dir mal ein etwas größeres Programm vor, das mit `a`, `w` und `z` hantiert. Mindestens ich müsste mir beim Lesen eine Notiz anlegen, um nicht immer wieder nachschauen zu müssen, auf was die Namen denn verweisen. Warum nicht `COUNTRY_CODE` an Stelle von `z`?
  3. Verwende Funktionen, sie sind etwas wunderbares! :wink:
  4. Öffne Dateien mit dem with statement. Damit stellst Du sicher, dass die Datei auch im Falle eines Fehlers wieder geschlossen wird.
Hier mal eine Idee von mir:

Code: Alles auswählen

import random

COUNTRY_CODE = '+49'

def write_to_file(filename, content):
    with open(filename, 'w') as file_:
        file_.write(content)

def main():
    while True:
        print("|--------------------------------|")
        print("|                                        |")
        print("|    IRGENDEINEN TEXT         |")
        print("|                                         |")
        print("|--------------------------------|")
        print("|VODAFONDE+++TELEKOM+++EPLUS+++O2|")
        print("| 152    |   151   |   157 | 159 |")
        print("| 162    |   160   |   163 | 176 |")
        print("| 172    |   170   |   177 | 179 |")
        print("| 173    |   171   |   178 |     |")
        print("| 174    |   175   |       |     |")
        print("|________________________________|")
        print("")
        print("")
        filename = input('Filename: ')
        prefix = input('Prefix: ')
        runs = int(input('How many mobile numbers to create? '))
        template = '{}{}{{phone_number}}\n'.format(COUNTRY_CODE, prefix)
        mobile_numbers = [template.format(
            phone_number=random.randint(11111111, 99999999)
        ) for _ in range(runs)]
        write_to_file(filename, ''.join(mobile_numbers))
        vote = input('Once more again (y/n)? ')
        if vote in 'nN':
            break

if __name__ == '__main__':
    main()
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@mutetella
Wenn man die Zeilen bereits mit angefügtem Newline-Zeichen als Liste vorliegen hat, dann kann man auch writelines() auf dem Dateiobjekt verwenden.

Man könnte sogar das '\n' am Ende weglassen und stattdessen die `print()`-Funktion nutzen (ungetestet):

Code: Alles auswählen

with open(filename, 'w') as outfile:
    for phone_number in phone_numbers:
        print(phone_number, file=outfile)
Oder man verwendet das bekanntere ``'\n'.join(lines)``, wobei man hierbei den kompletten String im Speicher hätte (was deinem Vorschlag ähnelt).
Antworten