Wenn ich den Begriff kennen würde, würde ich ihn googlen.

Du hast eine Idee für ein Projekt?
Benutzeravatar
__blackjack__
User
Beiträge: 13069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pad385: Wenn der Benutzer eine ungültige Eingabe für den Auftraggeber macht, dann wird `auftraggeber` nicht definiert, aber in der letzten Zeile versucht diese nicht definierte Variable auszugeben. `dic` ist auch kein sinnvoller Name. Abkürzungen in der Regel sowieso nicht, aber hier kommt noch dazu das den Leser nicht interessiert was das für ein Datentyp ist, sondern was dieses Wörterbuch im Kontext des Programms bedeutet.

Bei der Ausgabe des Eingabeaufforderung sind die Schlüssel des Wörterbuchs noch einmal manuell in die Zeichenkette geschrieben worden – die könnte/sollte man sich aus dem Wörterbuch holen um unnötige Arbeit und mögliche Fehler bei Programmänderungen zu vermeiden. Mindestens solange die Anfangsbuchstaben eindeutig sind, kann man die auch aus den Namen generieren, das heisst auch im Wörterbuch muss man die nicht selbst hin schreiben, sondern kann sie aus den Namen ermitteln.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

Wenn der Benutzer eine ungültige Eingabe für den Auftraggeber macht, dann wird `auftraggeber` nicht definiert, aber in der letzten Zeile versucht diese nicht definierte Variable auszugeben.
weil das skript beendet wird habe ich bei dem schnipsel nur nicht angefügt
Bei der Ausgabe des Eingabeaufforderung sind die Schlüssel des Wörterbuchs noch einmal manuell in die Zeichenkette geschrieben worden – die könnte/sollte man sich aus dem Wörterbuch holen um unnötige Arbeit und mögliche Fehler bei Programmänderungen zu vermeiden. Mindestens solange die Anfangsbuchstaben eindeutig sind, kann man die auch aus den Namen generieren, das heisst auch im Wörterbuch muss man die nicht selbst hin schreiben, sondern kann sie aus den Namen ermitteln.
waaaas? da weis ich jetzt nicht was du meinst der Auftraggeber ist doch variabel wie kann ich den dann aus nem Wörterbuch ziehen?
und wie soll ich 'h' dann 'Hofmeister' zuweisen wenn ich das nicht ins Wörterbuch schreiben soll ?!

so mal das ganze funktionierende Skript:

Code: Alles auswählen

#!/usr/bin/env python3
import locale
import csv
import time
from datetime import datetime, timedelta
from collections import namedtuple

def main():
    dic_auftraggeber = {'h':'Hofmeister', 'r':'Röck', 'b':'Binsch'}
    auftraggeber = input('Auftraggeber (h/r/b) : ')
    if auftraggeber.lower() not in ('h', 'r', 'b'):
        print('value_error, falsche eingabe')
        return
    if auftraggeber in dic_auftraggeber:
        auftraggeber = dic_auftraggeber[auftraggeber]
    kommission = input('Kommission : ')
    if kommission == 'rekla':
        rekla_kommissionen = input('Kommissionen : ')
    else:
        rekla_kommissionen = ''
    ort = input('Ort : ')
    chef = input('Chef : ')
    rekla = input('Reklamation (ja/ ) : ')
    if rekla == 'ja':
        grund = input('Kommission, Begründung der Reklamationen : ')
    else:
        grund = ''
    start = input('Arbeitsbeginn : ')
    ende = input('Arbeitsende : ')
    pause = input('Pause : ')
    time_start = datetime.strptime(start, '%H:%M')
    time_ende = datetime.strptime(ende, '%H:%M')
    time_pause = parse_timedelta(pause)
    if time_ende < time_start:
        print('Startuhrzeit größer als Enduhrzeit')
        exit()
    locale.setlocale(locale.LC_ALL, '')
    time_zeit = time_ende - time_start
    arbeitszeit_sekunden = (time_zeit - time_pause).total_seconds()
    hours, minutes = divmod(int(arbeitszeit_sekunden) // 60, 60)
    minutes = minutes / 60
    format_zeit = hours + minutes
    zeit = locale.format_string('%f', format_zeit)
    zeit = str(zeit)[:-4]
    test = input('Korrekte Eingaben? (JA) : ')
    if test != 'JA':
        return
    zeitpunkt = time.strftime('%d.%m.%Y__%H:%M:%S')
    eintrag = (
        f'Zeitpunkt des Eintrags: {zeitpunkt}   {auftraggeber}\n'
        f'Du warst heute mit {chef} in {ort} bei der Kommission {kommission}.\n'
        f'Du hast um {start} Uhr angefangen und um {ende} Uhr Feierabend'
        f' gemacht, dazwischen hast du {pause} Stunde(n) Pause gemacht.\n'
        f'Du hast {zeit} Stunden gearbeitet\n\n'
    )
    rekla_eintrag = (
        f'Zeitpunkt des Eintrags: {zeitpunkt}   {auftraggeber}\n'
        f'Du warst heute mit {chef} in {ort} bei der Kommission {kommission}.\n'
        f'Du hast {zeit} Stunden gearbeitet\nReklamationen: {grund}\n\n'
    )
    list_eintrag = [kommission, ort, zeitpunkt, zeit, pause, chef]
    rekla_tag_eintrag = (
        f'Zeitpunkt des Eintrags: {zeitpunkt}   {auftraggeber}\n'
        f'Du warst heute mit {chef} Reklamationen im {ort} erledigen.\n'
        f'Du hast um {start} Uhr angefangen und um {ende} Uhr Feierabend'
        f' gemacht, dazwischen hast du {pause} Stunde(n) Pause gemacht.\n'
        f'Du hast {zeit} Stunden gearbeitet,'
        f' du warst wieder bei Kommission {rekla_kommissionen}\n'
        f'Reklamationen: {grund}\n\n'
    )
    if kommission == 'rekla':
        with open('Arbeitszeitnachweis.txt', 'a', encoding='utf-8') as file:
            file.write(rekla_tag_eintrag)
    else:
        with open('Arbeitszeitnachweis.txt', 'a', encoding='utf-8') as file:
            file.write(eintrag)
    with open('Arbeitsstunden.csv', 'a', encoding='utf-8') as csv_file:
        writer = csv.writer(csv_file, delimiter=';')
        writer.writerow(list_eintrag)
    if rekla == 'ja':
        with open('Reklamationen.txt', 'a', encoding='utf-8') as file:
            file.write(rekla_eintrag)

def parse_timedelta(time):
    hours, minutes = map(int, time.split(':'))
    if not 0 <= minutes <= 60:
        raise ValueError('wrong time format')
    return timedelta(seconds = (hours*60 + minutes) * 60)

if __name__ == '__main__':
    main()
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du SOLLST das ins Wörterbuch schreiben. Du sollst es NICHT hart kodieren was in den Antwortmöglichkeiten steht. Sondern auch das aus dem Wörterbuch erstellen.

Code: Alles auswählen

 “, “.join(d.keys())
Benutzeravatar
__blackjack__
User
Beiträge: 13069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und beim zweiten Teil der Bemerkung war gemeinst das Du das auch nicht im Wörterbuch hart kodierst, denn das Wörterbuch selbst kann man ja nur aus den Namen erstellen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

Code: Alles auswählen

>>> dic = {'h':'Hofmeister', 'r':'Röck', 'b':'Binsch'}
>>> test = ', '.join(dic.keys())
>>> print(test)
h, r, b
>>> 
was bringt mir das dann ? mit h, r, b kann ich nichts anfangen..
das Wörterbuch aus welchen namen erstellen?
und WAS soll ich ins Wörterbuch schreiben ist das etwa falsch ?

Code: Alles auswählen

dic = {'h':'Hofmeister', 'r':'Röck', 'b':'Binsch'}
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du hast in deinem Code stehen

Code: Alles auswählen

    auftraggeber = input('Auftraggeber (h/r/b) : ')
Und wenn ich dir zeige, wie du aus den Schluesseln des Woerterbuches einen String bastelst, dann hast du wirklich ueberhaupt keine Vorstellung, wo das nuetzlich sein koennte? Gar keine? Wo kommen denn die GLEICHEN Buchstaben in deinem Programm vor? Und was passiert, wenn du einen neuen Auftraggeber anlegst im Woerterbuch? Welche stellen musst du da anfassen? Immer noch gar keine Idee?
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Pad385 hat geschrieben: Montag 22. April 2019, 16:35

Code: Alles auswählen

    if auftraggeber.lower() not in ('h', 'r', 'b'):
        print('value_error, falsche eingabe')
        return
    if auftraggeber in dic_auftraggeber:
        auftraggeber = dic_auftraggeber[auftraggeber]
Hast Du Dir die Zeilen mal gelesen, nachdem Du sie geschrieben hast? Welchen Sinn hat die doppelte Prüfung? Außer alles kompliziert, fehleranfällig und unfelxibel zu machen.

Dann habe ich mal die kritischen Punkte für Reklamationen herauskopiert:

Code: Alles auswählen

    if kommission == 'rekla':
        rekla_kommissionen = input('Kommissionen : ')
    else:
        rekla_kommissionen = ''
    if rekla == 'ja':
        grund = input('Kommission, Begründung der Reklamationen : ')
    else:
        grund = ''
    rekla_tag_eintrag = (
        f' du warst wieder bei Kommission {rekla_kommissionen}\n'
        f'Reklamationen: {grund}\n\n'
    )
    if kommission == 'rekla':
        with open('Arbeitszeitnachweis.txt', 'a', encoding='utf-8') as file:
            file.write(rekla_tag_eintrag)
Hier wird klar, dass kommission == 'rekla' bedingt, dass rekla == 'ja' ist, weil sonst grund leer wäre. Diese Bedingung hast Du aber nirgends erzwungen. Ob das Gegenteil auch zwingend ist, habe ich aber noch immer nicht herausgefunden.
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

nochmal zum Ablauf glaube da sind wir nicht ganz auf einer ebene wenn ich es bei mir teste funktioniert es
Kommission : Peter
Rekla : ja
Grund : Peter, Front
das gleiche ohne rekla:
Kommission : Peter
Rekla : fsdfgw

und der reklatag mit rekla:
Kommission : rekla
Kommissionen : Jugo, Hauser, Pfaffel
Rekla : ja
Grund : Jugo, Front; Pfaffel, Schubkasten
und der reklatag ohne rekla
Kommission : rekla
Kommissionen : Jugo, Hauser, Pfaffel
Rekla :

das sind doch alle Möglichkeiten die mein skript ausführen muss und es funktioniert doch auch
habe es 4 mal getestet alle texte und Dateien werden richtig erstellt..verstehe dein problem nicht
Hier wird klar, dass kommission == 'rekla' bedingt, dass rekla == 'ja' ist, weil sonst grund leer wäre. Diese Bedingung hast Du aber nirgends erzwungen. Ob das Gegenteil auch zwingend ist, habe ich aber noch immer nicht herausgefunden.
was meinst du mit 'ob das Gegenteil auch zwingend ist..' habe oben alle 4 Möglichkeiten wie das skript laufen kann vorgeführt
vielleicht klärt es sich damit. Grund ist leer sobald bei rekla nicht 'ja' angegeben wird
der Grund bezieht sich nicht nur auf den Reklatag sondern auf die neuen Reklas die man aufnimmt beim 'eintrag' hab ich den 'grund' vergessen habe das nun editiert hier mal das skipt:

Code: Alles auswählen

#!/usr/bin/env python3
import locale
import csv
import time
from datetime import datetime, timedelta
from collections import namedtuple

def main():
    dic_auftraggeber = {'h':'Hofmeister', 'r':'Röck', 'b':'Binsch'}
    str_auftraggeber = '/'.join(dic_auftraggeber.keys())
    auftraggeber = input(f'Auftraggeber ({str_auftraggeber}) : ')
    if auftraggeber in dic_auftraggeber:
        auftraggeber = dic_auftraggeber[auftraggeber]
    else:
        print('value_error, falsche eingabe')
        return
    kommission = input('Kommission : ')
    if kommission == 'rekla':
        rekla_kommissionen = input('Kommissionen : ')
    else: rekla_kommissionen = ''
    ort = input('Ort : ')
    chef = input('Chef : ')
    rekla = input('Reklamation (ja/ ) : ')
    if rekla == 'ja':
        grund = input('Kommission, Begründung der Reklamationen : ')
    else: grund = ''
    start = input('Arbeitsbeginn : ')
    ende = input('Arbeitsende : ')
    pause = input('Pause : ')
    locale.setlocale(locale.LC_ALL, '')
    time_start = datetime.strptime(start, '%H:%M')
    time_ende = datetime.strptime(ende, '%H:%M')
    time_pause = parse_timedelta(pause)
    if time_ende < time_start:
        print('Startuhrzeit größer als Enduhrzeit')
        return
    time_zeit = time_ende - time_start
    arbeitszeit_sekunden = (time_zeit - time_pause).total_seconds()
    hours, minutes = divmod(int(arbeitszeit_sekunden) // 60, 60)
    minutes = minutes / 60
    format_zeit = hours + minutes
    zeit = locale.format_string('%f', format_zeit)
    zeit = str(zeit)[:-4]
    test = input('Korrekte Eingaben? (JA) : ')
    if test != 'JA': return
    zeitpunkt = time.strftime('%d.%m.%Y__%H:%M:%S')
    if kommission != 'rekla':
        eintrag = (
            f'Zeitpunkt des Eintrags: {zeitpunkt}   {auftraggeber}\n'
            f'Du warst heute mit {chef} in {ort} bei der Kommission {kommission}.\n'
            f'Du hast um {start} Uhr angefangen und um {ende} Uhr Feierabend'
            f' gemacht, dazwischen hast du {pause} Stunde(n) Pause gemacht.\n'
            f'Du hast {zeit} Stunden gearbeitet\nReklamationen: {grund}\n\n'
        )
    else:
        rekla_tag_eintrag = (
            f'Zeitpunkt des Eintrags: {zeitpunkt}   {auftraggeber}\n'
            f'Du warst heute mit {chef} Reklamationen im {ort} erledigen.\n'
            f'Du hast um {start} Uhr angefangen und um {ende} Uhr Feierabend'
            f' gemacht, dazwischen hast du {pause} Stunde(n) Pause gemacht.\n'
            f'Du hast {zeit} Stunden gearbeitet,'
            f' du warst wieder bei Kommission {rekla_kommissionen}\n'
            f'Reklamationen: {grund}\n\n'
        )
    if rekla == 'ja':
        rekla_eintrag = (
            f'Zeitpunkt des Eintrags: {zeitpunkt}   {auftraggeber}\n'
            f'Du warst heute mit {chef} in {ort} bei der Kommission {kommission}.\n'
            f'Du hast {zeit} Stunden gearbeitet\nReklamationen: {grund}\n\n'
        )
    list_eintrag = [kommission, ort, zeitpunkt, zeit, pause, chef]
    if kommission == 'rekla':
        with open('Arbeitszeitnachweis.txt', 'a', encoding='utf-8') as file:
            file.write(rekla_tag_eintrag)
    else:
        with open('Arbeitszeitnachweis.txt', 'a', encoding='utf-8') as file:
            file.write(eintrag)
    with open('Arbeitsstunden.csv', 'a', encoding='utf-8') as csv_file:
        writer = csv.writer(csv_file, delimiter=';')
        writer.writerow(list_eintrag)
    if rekla == 'ja':
        with open('Reklamationen.txt', 'a', encoding='utf-8') as file:
            file.write(rekla_eintrag)

def parse_timedelta(time):
    hours, minutes = map(int, time.split(':'))
    if not 0 <= minutes <= 60:
        raise ValueError('wrong time format')
    return timedelta(seconds = (hours*60 + minutes) * 60)

if __name__ == '__main__':
    main()
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Also wird immer ein Reklamationsgrund ausgegeben, auch wenn es sich gar nicht um eine Reklamation handelt oder kein Grund angegeben wurde.
Das war für mich halt verwirrend, weil ein leeres Feld normalerweise halt nicht sinnvoll verwendbar ist.

Dann kann man jetzt vereinfachen:

Code: Alles auswählen

    if kommission != 'rekla':
        eintrag = (
            f'Zeitpunkt des Eintrags: {zeitpunkt}   {auftraggeber}\n'
            f'Du warst heute mit {chef} in {ort} bei der Kommission {kommission}.\n'
            f'Du hast um {start} Uhr angefangen und um {ende} Uhr Feierabend'
            f' gemacht, dazwischen hast du {pause} Stunde(n) Pause gemacht.\n'
            f'Du hast {zeit} Stunden gearbeitet\nReklamationen: {grund}\n\n'
        )
    else:
        eintrag = (
            f'Zeitpunkt des Eintrags: {zeitpunkt}   {auftraggeber}\n'
            f'Du warst heute mit {chef} Reklamationen im {ort} erledigen.\n'
            f'Du hast um {start} Uhr angefangen und um {ende} Uhr Feierabend'
            f' gemacht, dazwischen hast du {pause} Stunde(n) Pause gemacht.\n'
            f'Du hast {zeit} Stunden gearbeitet,'
            f' du warst wieder bei Kommission {rekla_kommissionen}\n'
            f'Reklamationen: {grund}\n\n'
        )
    with open('Arbeitszeitnachweis.txt', 'a', encoding='utf-8') as file:
        file.write(eintrag)
    if rekla == 'ja':
        rekla_eintrag = (
            f'Zeitpunkt des Eintrags: {zeitpunkt}   {auftraggeber}\n'
            f'Du warst heute mit {chef} in {ort} bei der Kommission {kommission}.\n'
            f'Du hast {zeit} Stunden gearbeitet\nReklamationen: {grund}\n\n'
        )
        with open('Reklamationen.txt', 'a', encoding='utf-8') as file:
            file.write(rekla_eintrag)
    list_eintrag = [kommission, ort, zeitpunkt, zeit, pause, chef]
    with open('Arbeitsstunden.csv', 'a', encoding='utf-8') as csv_file:
        writer = csv.writer(csv_file, delimiter=';')
        writer.writerow(list_eintrag)
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

ahhh jetzt hab ich auch dich verstanden ich dachte ich soll aus
f'Zeitpunkt des Eintrags: {zeitpunkt} {auftraggeber}\n'
f'Du warst heute mit {chef} in {ort} bei der Kommission {kommission}.\n'
f'Du hast um {start} Uhr angefangen und um {ende} Uhr Feierabend'
f' gemacht, dazwischen hast du {pause} Stunde(n) Pause gemacht.\n'
f'Du hast {zeit} Stunden gearbeitet\nReklamationen: {grund}\n\n'
und
f'Zeitpunkt des Eintrags: {zeitpunkt} {auftraggeber}\n'
f'Du warst heute mit {chef} Reklamationen im {ort} erledigen.\n'
f'Du hast um {start} Uhr angefangen und um {ende} Uhr Feierabend'
f' gemacht, dazwischen hast du {pause} Stunde(n) Pause gemacht.\n'
f'Du hast {zeit} Stunden gearbeitet,'
f' du warst wieder bei Kommission {rekla_kommissionen}\n'
f'Reklamationen: {grund}\n\n'
ein einzigen eintrag machen^^
des sieht jetzt auf einmal so einfach geschrieben aus ich denk zu kompliziert haha
Antworten