@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.
Wenn ich den Begriff kennen würde, würde ich ihn googlen.
- __blackjack__
- User
- Beiträge: 13919
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware
weil das skript beendet wird habe ich bei dem schnipsel nur nicht angefügtWenn 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.
waaaas? da weis ich jetzt nicht was du meinst der Auftraggeber ist doch variabel wie kann ich den dann aus nem Wörterbuch ziehen?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.
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()
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())
- __blackjack__
- User
- Beiträge: 13919
- 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.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware
Code: Alles auswählen
>>> dic = {'h':'Hofmeister', 'r':'Röck', 'b':'Binsch'}
>>> test = ', '.join(dic.keys())
>>> print(test)
h, r, b
>>>
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'}
Du hast in deinem Code stehen
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?
Code: Alles auswählen
auftraggeber = input('Auftraggeber (h/r/b) : ')
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.Pad385 hat geschrieben: ↑Montag 22. April 2019, 16:35Code: 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]
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)
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
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:
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
was meinst du mit 'ob das Gegenteil auch zwingend ist..' habe oben alle 4 Möglichkeiten wie das skript laufen kann vorgeführtHier 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.
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()
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:
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)
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
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