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

Du hast eine Idee für ein Projekt?
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

Code: Alles auswählen

    start = input('Arbeitsbeginn : ')
    time_start = datetime.strptime(start, "%H:%M")
    ende = input('Arbeitsende : ')
    time_ende = datetime.strptime(ende, "%H:%M")
    if time_ende < time_start:
        print('Value_Error')
        time.sleep(3)
        return
    pause = input('Pause : ')
    time_pause = datetime.strptime(pause, "%H:%M")
    time_zeit = time_ende - time_start - pause
    sekunden = timedelta.total_seconds(time_zeit)
    minuten = time_zeit / 60
    stunden = minuten / 60
so nur was bringt mir das ich habe doch jetzt trotzdem nur die stunden und Minuten nur halt getrennt also wie mache ich jetzt aus der variable Minuten eine Dezimalzahl mit stunden und Minuten im moment bekomme ich ja dann am ende bei wert 10:45 das Ergebnis 10,45
wenn ich
Minuten = time_zeit / 60 / 60
stunden = minuten / 60
und das ganze zusammensetzte kommt ja z.B. 10,0,75 raus
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pad385: Dann rechne das aus den Gesamtsekunden aus. Die einfach mal (60 * 60) rechnen, als Zeichenkette mit zwei Nachkommastellen formatieren (`format()`) und da dann den Dezimalpunkt durch ein Dezimalkomma ersetzen und Du hast was Du brauchst.
„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

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

def main():
    auftraggeber = input('Auftraggeber (h/r/b) : ')
    if auftraggeber == 'h': auftraggeber = 'Hofmeister'
    if auftraggeber == 'r': auftraggeber = 'Röck'
    if auftraggeber == 'b': auftraggeber = 'Binsch'
    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 : ')
    obj_start = datetime.strptime(start, "%H:%M")
    ende = input('Arbeitsende : ')
    obj_ende = datetime.strptime(ende, "%H:%M")
    if obj_ende < obj_start:
        print('Value_Error')
        time.sleep(3)
        return
    pause = input('Pause : ')
    obj_pause = datetime.strptime(pause, "%H:%M")
    obj_zeit = obj_ende - obj_start - obj_pause
    sekunden = timedelta.total_seconds(obj_zeit)
    zeit = sekunden / 60 / 60
    zeitpunkt = time.strftime('%d.%m.%Y__%H:%M:%S')
    str_zeit = str(obj_zeit)[:-3]
kannst mir noch sagen wieso er in obj_zeit ein fehler ausgibt?
Arbeitsbeginn : 6:15
Arbeitsende : 18:00
Pause : 1:00
Traceback (most recent call last):
File "./arbeit.py", line 78, in <module>
main()
File "./arbeit.py", line 33, in main
obj_zeit = obj_ende - obj_start - obj_pause
TypeError: unsupported operand type(s) for -: 'datetime.timedelta' and 'datetime.datetime'
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pad385: Na da steht doch da: Du versucht von einem `timedelta`-Objekt ein `datetime`-Objekt abzuziehen, was verständlicherweise nicht geht. Was soll denn dabei heraus kommen? Wenn Du zum Beispiel von 10 Stunden und 45 Minuten den 01.01.1900 um 1 Uhr nachts abziehst, was sollte da ein sinnvolles Ergebnis sein?

Überlege mal was von diesen Werten ein Zeitpunkt und was eine Zeitspanne ist, und vergleiche das mit den tatsächlichen Datentypen die Du für die Werte verwendest.

Warum hast Du vor einige Namen diesen sinnfreien `obj_*`-Präfix gesetzt? In Python ist *alles* was man an einen Namen binden kann ein Objekt. Das müsstest Du dann also bei jedem Namen davor setzten. Oder eben bei keinem, denn dieser Präfix bietet absolut keinen Mehrwert.
„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

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

def main():
    auftraggeber = input('Auftraggeber (h/r/b) : ')
    if auftraggeber == 'h': auftraggeber = 'Hofmeister'
    if auftraggeber == 'r': auftraggeber = 'Röck'
    if auftraggeber == 'b': auftraggeber = 'Binsch'
    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 : ')
    timeobj_start = datetime.strptime(start, "%H:%M")
    ende = input('Arbeitsende : ')
    timeobj_ende = datetime.strptime(ende, "%H:%M")
    if timeobj_ende < timeobj_start:
        print('Value_Error')
        time.sleep(3)
        return
    pause = input('Pause : ')
    timeobj_pause = datetime.strptime(pause, "%H:%M")
    timeobj_zeit = timeobj_ende - timeobj_start - timeobj_pause
    sekunden = timedelta.total_seconds(timeobj_zeit)
    zeit = sekunden / 60 / 60
    format_zeit = '{%H,%M}'.format(zeit)
    zeitpunkt = time.strftime('%d.%m.%Y__%H:%M:%S')
    str_zeit = str(timeobj_zeit)[:-3]

aber
start = input('Arbeitsbeginn : ')
timeobj_start = datetime.strptime(start, "%H:%M")
ende = input('Arbeitsende : ')
timeobj_ende = datetime.strptime(ende, "%H:%M")
pause = input('Pause : ')
timeobj_pause = datetime.strptime(pause, "%H:%M")

sind doch alles die gleichen Objekte?! check ich nicht da steht überall datetime ich habe ja mit keinen der werte gerechnet und ausgerechnet wurden die auch nicht
start ist ein zeitpunkt genau wie ende und pause ist eine Zeitspanne

das mit dem timeeobj habe ich gemacht weil Sirius in einem vorherigen beitrag über die namensvergebung geplänkert hat :)
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pad385: Das `obj` da nun innerhalb des Namens zu schreiben macht es nicht sinnvoller…

Ja, die haben alle den gleichen Typ. Sollten sie das denn? Die Frage impliziert ja im Grunde schon ein: Nein, sollten sie nicht. Denn eines von den dreien ist anders als die anderen beiden. Nochmal welcher von diesen Werten ist in der Realität ein Zeipunkt und welcher ist eine Zeitspanne?

Und natürlich rechnest Du mit denen – genau in der Zeile in der ein Problem damit auftritt, steht ganz offensichtlich eine Rechnung an der alle drei Werte als Operanden beteiligt sind.

Wenn der Benutzer bei der ersten Frage einen anderen Buchstaben als 'h', 'r', oder 'b' eingibt, hast Du ein Problem. Die ``if``\s und die Namen im Code sind auch nicht gerade praktisch. Da würde man eher eine Datenstruktur verwenden, zum Beispiel ein Wörterbuch, und das am Anfang als Konstante definieren. Daraus kann man dann auch den Prompt für die Frage generieren, so dass man nicht 'h', 'r', und 'b' dort und bei den ``if``-Bedingungen stehen haben muss.

Da steht mittlerweile auch schon viel zu viel in der einen Funktion. Benutzerinteraktion und Programmlogik sollte man vielleicht auch langsam mal trennen. Dann kann man die Funktion die aus Start, Ende, und Pause die Zeit in Stunden berechnet, zum Beispiel auch einfacher testen.

Was man vielleicht auch abfangen möchte sind Benutzer die Pausen eingeben die länger als die Arbeitszeit sind. Wie gesagt, Benutzer geben absichtlich oder aus versehen die abenteuerlichsten Sachen ein. Und wenn der Benutzer etwas eingibt was sich nicht als Stunde:Minute parsen lässt, sollte das Programm besser auch nicht einfach so abbrechen. Auch hier würde sich eine Funktion anbieten in der der Benutzer eine Uhrzeit/Zeitspanne in Stunden und Minuten eingeben kann, weil man die drei mal braucht.
„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

start ist ein Zeitpunkt ende ist ein Zeitpunkt und pause ist eine Zeitspanne wobei bei start, ende und pause werden doch genau die gleichen eingaben gefordert nämlich %H:%M und es wird in ein datetimeobjekt geschrieben also sind die doch alle gleich also wieso kann man dann damit nicht rechnen?!

das der benutzer noch falsche angaben machen kann ist mal nebenhingestellt die paar zeilen schreibe ich am ende
das programm soll nicht kommerziell verwendet werden zumindest erstmal noch bin in angestellter das ändert sich aber irgendwann in der zukunft aber bis dahin bleibt das program nur auf meinem rechner
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Weil es sinnlos ist damit zu rechnen. Was ist denn deiner Meinung nach 10:00 - 9:00? Das sind nunmal ZeitPUNKTE, und zwischen zweien davon gibt es einen ZeitUNTERSCHIED (oder Spanne, eben timedelta). Und aus einem ZeitPUNKT und einem ZeitUNTERSCHIED kann man einen weiteren ZeitPUNKT berechnen. 10:00 + 1h == 11:00. Aber 13:00 - 14:00 waere dann was nach deiner Logik? -1:00 morgens? Das gibt's vielleicht in Hogwarts. In der echten Welt eher nicht so. Und selbst wenn du das nicht einsehen magst, so ist's halt gegeben. Was genau also bringt es, sich darueber zu aergern? Wenn du aus einer Eingabe von 1:00 eine Zeitspanne machen willst, dann subtrahier halt halt 1:00 - 0:00, und du hast dein 1h-timedelta.
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pad385: Das der Benutzer Zeitpunkte und -spannen im selben Format eingibt, ändert nichts daran, dass das konzeptionell verschiedene Dinge sind. Und das man die auch so behandeln muss wenn man damit rechnen will. Wie schon gesagt, was soll denn 4 Stunden und 25 Minuten minus den 01.01.1900 um 1 Uhr für ein Ergebnis ergeben? Das macht einfach keinen Sinn. Und darum geht das nicht.
„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

okay verstanden aber wie soll ich das dann machen, so wie deets sagt?

meinst du so umschreiben?

Code: Alles auswählen

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

def read():
    #pattern = {'h': 'Hofmeister', 'r': 'Röck', 'b': 'Binsch'}
    auftraggeber = input('Auftraggeber (h/r/b) : ')
    if auftraggeber == 'h': auftraggeber = 'Hofmeister'
    if auftraggeber == 'r': auftraggeber = 'Röck'
    if auftraggeber == 'b': auftraggeber = 'Binsch'
    kommission = input('Kommission : ')
    if kommission == 'rekla':
        rekla_kommissionen = input('Kommissionen : ')
    else:
        rekla_kommissionen = ''
    ort = input('Ort : ')
    chef = input('Chef : ')
    rekla = input('Reklamation (ja/ ) : ')
    start = input('Arbeitsbeginn : ')
    ende = input('Arbeitsende : ')
    pause = input('Pause : ')

def write():
       if time_ende < timeobj_start:
    print('Value_Error, Zeitangaben')
       time.sleep(3)
       return
    if rekla == 'ja':
        grund = input('Kommission, Begründung der Reklamationen : ')
    else:
        grund = ''
    timeobj_start = datetime.strptime(start, "%H:%M")
    time_ende = datetime.strptime(ende, "%H:%M")
    time_pause = datetime.strptime(pause, "%H:%M")
    time_zeit = time_ende - time_start - time_pause
    sekunden = timedelta.total_seconds(time_zeit)
    zeit = sekunden / 60 / 60
    format_zeit = '{%H,%M}'.format(zeit)
    zeitpunkt = time.strftime('%d.%m.%Y__%H:%M:%S')
    str_zeit = str(time_zeit)[:-3]
    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 {str_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 {str_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 {str_zeit} Stunden gearbeitet,'
        f' du warst wieder bei Kommission {rekla_kommissionen}\n'
        f'Reklamationen: {grund}\n\n'
    )
    test = input('Korrekte Eingaben? (JA) : ')
    if test == 'JA':
        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)
    else:
        return
    
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pad385: Das funktioniert ja offensichtlich nicht weil in der ersten Funktion lokale Namen definiert werden, mit denen nichts gemacht wird, und in der zweiten Funktion versucht wird Namen zu verwenden, die es nicht gibt.

Das Programm in „lesen“ und „schreiben“ zu unterteilen ist auch recht grob, auch wenn eine Aufteilung von Eingabe, Verarbeitung, und Ausgabe grundsätzlich nicht unüblich ist. Aber die Aufteilung stimmt so ja auch nicht weil auch in `write()` noch Angaben vom Benutzer eingelesen werden. Wenn man es tatsächlich so unterteilt, dann muss man momentan auch einen ziemlichen Haufen Einzelwerte zurück- und/oder übergeben. Man könnte da mal überlegen ob man das irgendwie strukturiert. Mit `collections.namedtuple()` oder eigenen Klassen.

Was hat die Eingabe 'rekla' bei Kommissionen eigentlich für eine Bedeutung? Kann man da 'rekla' eingeben, die Frage nach Reklamation später dann aber *nicht* mit Ja beantworten? Falls nein, ist der Ablauf falsch strukturiert oder die extra Frage nach Reklamation redundant und damit überflüssig.

Das ``else: return`` am Ende macht keinen Sinn weil das keinen feststellbaren Effekt auf den Programmablauf hat.
„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

das das nicht funktioniert ist mir klar mir ist nur nicht klar was du meinst mit "Benutzerinteraktion und Programmlogik sollte man vielleicht auch langsam mal trennen."
also was es bedeutet weis ich nur weis ich nicht wie ich das umsetzen soll
das mit rekla stimmt wenn man eine rekla tour fährt schreibt man bei Kommission rekla rein und muss trotzdem gefragt werden ob es wieder Reklas gibt..leider^^

stimmt das return brauch ich ja gar nicht^^
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pad385: Programmlogik hast Du ja nicht so viel, aber das könnte man halt aus dem Teil mit der Benutzerinteraktion heraus nehmen. Also das wo Daten verarbeitet werden, was nicht direkt mit der Eingabe durch den Benutzer oder die Ausgabe der Daten betrifft. Zum Beispiel eben die Berechnung der Zeit aus den eingegebenen Daten. Die Teile des Programms die unabhängig davon sind das Du die Daten per `input()` vom Benutzer abfragst und ihm etwas mit `print()` mitteilst. Oder anders gesagt: Wenn Du da irgendwann eine GUI oder eine Weboberfläche drauf setzen würdest, hast Du ja Code den Du dann nicht noch mal schreiben oder da rein kopieren wolltest, weil der unabhängig davon ist.

Ich glaube auf `eintrag` und `rekla_tag_eintrag` wurdest Du schon einmal hingewiesen. Davon sollte nur ein Name existieren der entweder an den einen oder an den anderen Text gebunden wird, denn die schliessen sich ja anscheinend gegenseitig aus. Zudem haben alle drei Texte Gemeinsamkeiten die man heraus ziehen kann. Den `list_eintrag` könnte man auch als `collections.namedtuple()` am Anfang definieren und dann für die Erstellung der Texte heran ziehen. Da hätte man dann schon mal ein paar Einzelwerte sinnvoll zusammengefasst.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pad385: Ich würde für den Anfang aber vielleicht auch gar nicht in grosse Abschnitte/Funktionen aufteilen, sondern erst einmal die ganzen Abfragen vom Benutzer die nicht einfach nur aus einem `input()` bestehen in Funktionen auslagern. Zum Beispiel `erfrage_aufraggeber()`, `erfrage_zeitpunkt()`, `erfrage_dauer()`, `erfrage_ja_nein()`. Und die dann auch gleich die Eingaben validieren und konvertieren lassen. Dann hast Du zum Beispiel im Hauptprogramm auch nicht das Problem alle Zeiteingaben in zwei Formen zu haben und Dir unterschiedliche Namen dafür ausdenken zu müssen. `start` wäre dann in der Hauptfunktion ein `datetime`-Objekt und keine Zeichenkette. Die drei Funktionen zur Abfrage von Start, Ende, und Pause könnte man dann auch in einer Funktion `erfrage_arbeitszeit()` verwenden und nur die von der Hauptfunktion aufrufen. Die könnte beispielsweise die Eingaben validieren. Und dann ein Verbundobjekt (`collections.namedtuple()`) zurück geben bei dem die Gesamtzeit auch gleich als Element/Attribut ausgerechnet existiert.
„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

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

def main():
    xyz = namedtuple('arbeitstag', 'Kommission Ort Eintrag Arbeitszeit Pause Chef')
    xy = namedtuple('auftraggeber', 'Hofmeister Röck Binsch')
    auftraggeber = input('Auftraggeber (h/r/b) : ')
    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 : ')
    if time_ende < timeobj_start:
        print('Value_Error, Zeitangaben')
        time.sleep(3)
        return
    pause = input('Pause : ')
    test = input('Korrekte Eingaben? (JA) : ')
    if test != 'JA':
        return
    if auftraggeber == 'h': auftraggeber = 'Hofmeister'
    if auftraggeber == 'r': auftraggeber = 'Röck'
    if auftraggeber == 'b': auftraggeber = 'Binsch'
    time_ende = datetime.strptime(ende, "%H:%M")
    timeobj_start = datetime.strptime(start, "%H:%M")
    timeobj_start = datetime.strptime(start, "%H:%M")
    time_pause = datetime.strptime(pause, "%H:%M")
    time_zeit = time_ende - time_start - time_pause
    sekunden = timedelta.total_seconds(time_zeit)
    stunden = sekunden / 60 / 60
    zeit = str(stunden)
    zeitpunkt = time.strftime('%d.%m.%Y__%H:%M:%S')
    str_zeit = str(time_zeit)[:-3]
    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 {str_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 {str_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 {str_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)

if __name__ == '__main__':
    main()

### Kommentare ###
# Verschiedene Touren

was bringt mir die tuple? wieso muss ich nochmal auf die liste zugreifen?
die werte in der tuple existieren doch noch gar nicht ich blick nicht was mir das in meinem skript bringen soll

ich weis auch nicht wie ich du willst das ich das skript umschreibe meiner meinung nach stehten im oberen teil
die Benutzereingaben, in der Mitte kommt der Prozess und am Ende werden die dateien geschrieben


das ich die zwei mega texte kombinieren soll hört sich gut an nur weis ich nicht wie^^
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pad385: Da ist was falsch eingerückt und durch das umsortieren der Zeilen ist auch nicht alles definiert bevor damit etwas gemacht werden soll.

Die `namedtuple()` bringen Dir so gar nichts, Du verwendest sie ja auch nicht. Die Tupel-Typen würde man auch ausserhalb der Funktion auf Modulebene erstellen und wie Klassen benennen und der Name ist üblicherweise gleich dem Namen den man als erstes Argument angibt. Der zweite so erstellte Typ macht keinen Sinn, denn der Auftraggeber ist ja kein zusammengesetzter Wert, sondern einfach nur ein Name. Die üblichen Namenskonventionen gelten auch für `namedtuple()`-Exemplare – der Typname in MamelCase und die Attributnamen klein_mit_unterstrichen.

Die würden was bringen wenn man das auf Funktionen aufteilen würde → man würde nicht so viele Einzelwerte in der Gegend herum reichen müssen. Aber mach halt weiter mit *einer* Funktion die *alles* macht, alles auf einzelne Namen verteilt und davon 27 Stück verwendet und über 50 Anweisungen in 70 Zeilen enthält. Mir ist das alles deutlich zu viel und jetzt schon zu unübersichtlich, und da ist noch so gut wie keine Fehlerbehandlung drin.

Die Umsortierung der Zeilen macht es übrigens nicht besser. Die Trennung zwischen Eingabe und Verarbeitung bedeutet nicht das im ersten Teil (Eingabe) nur das gemacht werden darf was der Benutzer direkt per `input()` eingibt. Da gehört auch die Validierung und Umwandlung der Eingaben in Werte/Typen dazu, die dann von der Verarbeitung benötigt werden. Wie schon gesagt, braucht man dann auch gewisse Werte nicht in verschiedenen Formen an verschiedene Namen binden.
„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

Dazu musst du mir ein beispiel geben ich seh nicht so recht vor mir was du meinst..
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

hab das ganze mal gesplittet und mit der zeit angefangen..läuft nicht so ganz^^

Code: Alles auswählen

auftraggeber = input('Auftraggeber (h/r/b) : ')
if auftraggeber != 'h' or 'r' or 'b': #f
    print('value_error, falsche eingabe')
if auftraggeber == 'h': auftraggeber = 'Hofmeister'
if auftraggeber == 'r': auftraggeber = 'Röck'
if auftraggeber == 'b': auftraggeber = 'Binsch'

Code: Alles auswählen

import locale
import time
from datetime import datetime, timedelta

start = input('Arbeitsbeginn : ')
ende = input('Arbeitsende : ')
pause = input('Pause : ')
time_start = datetime.strptime(start, '%H:%M')
time_ende = datetime.strptime(ende, '%H:%M')
if time_ende < time_start:
    print('Value_Error, Zeitangaben')
    time.sleep(3)
    exit()
locale.setlocale(locale.LC_ALL, 'german')
time_pause = datetime.strptime(pause, '%H:%M')
z_zeit = time_ende - time_start
z_zeit = str(z_zeit)
time_zeit = datetime.strptime(z_zeit, '%H:%M') #f
total_sekunden = timedelta.total_seconds(time_zeit)
minuten = total_sekunden / 60
stunden = minuten / 60
pause_sekunden = timedelta.total_seconds(time_pause)
arbeitszeit_sekunden = total_sekunden - pause_sekunden
arbeitszeit = arbeitszeit_sekunden / 60 / 60
format_zeit = locale.format_string('%f', arbeitszeit)
zeit = str(format_zeit)[:-4]

Code: Alles auswählen

kommission = input('Kommission : ')
if kommission == 'rekla':
    rekla_kommissionen = input('Kommissionen : ')
else:
    rekla_kommissionen = ''

Code: Alles auswählen

ort = input('Ort : ')
chef = input('Chef : ')

Code: Alles auswählen

rekla = input('Reklamation (ja/ ) : ')
if rekla == 'ja':
    grund = input('Kommission, Begründung der Reklamationen : ')
else:
    grund = ''

Code: Alles auswählen

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 {str_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 {str_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 {str_zeit} Stunden gearbeitet,'
    f' du warst wieder bei Kommission {rekla_kommissionen}\n'
    f'Reklamationen: {grund}\n\n'
)

Code: Alles auswählen

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)
Zuletzt geändert von Pad385 am Samstag 20. April 2019, 16:58, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Pad385: was heißt denn, „läuft nicht so ganz“?

›or‹ darf nicht mit einem umgangssprachlichen „oder” gleichgesetzt werden.
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

Code: Alles auswählen

import locale
import time
from datetime import datetime, timedelta

start = input('Arbeitsbeginn : ')
ende = input('Arbeitsende : ')
pause = input('Pause : ')
time_start = datetime.strptime(start, '%H:%M')
time_ende = datetime.strptime(ende, '%H:%M')
if time_ende < time_start:
    print('Value_Error, Zeitangaben')
    time.sleep(3)
    exit()
locale.setlocale(locale.LC_ALL, 'german')
time_pause = datetime.strptime(pause, '%H:%M')
z_zeit = time_ende - time_start
z_zeit = str(z_zeit)
time_zeit = datetime.strptime(z_zeit, '%H:%M') #f
total_sekunden = timedelta.total_seconds(time_zeit)
pause_sekunden = timedelta.total_seconds(time_pause)
arbeitszeit_sekunden = total_sekunden - pause_sekunden
arbeitszeit = arbeitszeit_sekunden / 60 / 60
format_zeit = locale.format_string('%f', arbeitszeit)
zeit = str(format_zeit)[:-4]
Arbeitsbeginn : 6:15
Arbeitsende : 18:00
Pause : 1:00
Traceback (most recent call last):
File "./arbeitszeit_erfragen.py", line 18, in <module>
time_zeit = datetime.strptime(z_zeit, '%H:%M') #f
File "C:\Users\phili\AppData\Local\Programs\Python\Python37\lib\_strptime.py", line 577, in _strptime_datetime
tt, fraction, gmtoff_fraction = _strptime(data_string, format)
File "C:\Users\phili\AppData\Local\Programs\Python\Python37\lib\_strptime.py", line 362, in _strptime
data_string[found.end():])
ValueError: unconverted data remains: :00

und die pause muss ich auch noch irgendwie abziehen hoffe das klappt so wie ich mir das vorstelle oder bin ich auf m Holzweg?
Sirius3 hat geschrieben: Samstag 20. April 2019, 16:57
›or‹ darf nicht mit einem umgangssprachlichen „oder” gleichgesetzt werden.
da war autoit einfacher^^
Zuletzt geändert von Pad385 am Sonntag 21. April 2019, 13:27, insgesamt 2-mal geändert.
Antworten