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

#a Hallo Community, habe Erfahrungen mit AutoIt gemacht und möchte gerne Python lernen und verstehen. #
#b was ich hiermit erreichen will sollte jedem klar sein sobald er den Code anschaut, #
#c falls nicht..ich möchte die Übersicht nicht verlieren.:) #
#d falls jemand Zeit hat und sich das hier anschaut bitte sendet mir keine fertigen Codes. #

Code: Alles auswählen

#!/usr/bin/env python
import time
kom = str(input('Kommission : '))
ort = str(input("Ort : "))
chef = str(input("Chef : "))
start = str(input("Arbeitsbeginn : "))
ende = str(input("Arbeitsende : "))
zeit = str(input("Arbeitszeit : "))
pause = str(input("Pause : "))
datum_uhrzeit = time.strftime('%d.%m.%Y %H:%M:%S')
new = str('Zeitpunkt des Eintrags: ' + datum_uhrzeit + '\nDu warst heute mit ' + str(chef) + ' in ' + str(ort) + ' bei der Kommission ' + str(kom) + '.\nDu hast um ' + str(start) + ' Uhr angefangen und um ' + str(ende) + ' Uhr Feierabend gemacht, dazwischen hast du ' + str(pause) + ' Stunde(n) Pause gemacht.\n\n')
with open('Arbeitszeitnachweis.txt', 'a') as file:
    file.write(str(new))
with open('Arbeitsstunden.txt', 'a') as fileStunden:
    fileStunden.write(time.strftime('%d.%m.%Y') + '\t' + str(zeit) + ' Stunden\tmit ' + chef + '\n')
#e Kommentare #
#f schreiben und speichern fertig #
#g monatlich auswerten, nach Kommission suchen ...
#h Stunden ausrechnen
#i brauche ich zwei files?! Stichwort Datenbanken? oder Listen?!
#j Ideen und Kritik sind erwünscht!
#k zum Thema #g : monatlich wird die .txt-Datei umbenannt und mit einem seperaten Skript werden die Arbeitsstunden ausgewertet
#l suchen kann ich über den Editor nur überschneidet sich [/c] kom [c] manchmal auch, also will ich [/c] datum_uhrzeit [c] mit [/c] kom [/c] kombinieren
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pad385: Da sind viel zu viele `str()`-Aufrufe.

Wenn das Python 2 ist, dann werden Zeichenketteneingaben mit `input()` so nicht wirklich sinnvoll funktionieren, denn dafür gibt es die `raw_input()`-Funktion. Das sollte aber kein Python 2 sein, denn das läuft Ende dieses Jahres aus. Neue Programme sollte man in Python 3 entwickeln.

Da ist dann `input()` richtig. Das liefert eine Zeichenkette und es macht keinen Sinn diese Zeichenkette `str()` zu übergeben, denn dadurch wird die auch nicht ”zeichenkettiger”. ;-)

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Namen sollten verraten was der Wert bedeutet und keine unüblichen Abkürzungen enthalten. Wenn `kom` für „Kommission“ stehen soll, dann sollte es auch `kommission` heissen.

`new` sagt nicht wirklich etwas aus über den Wert. Bei der Definition sind auch wieder viel zu viele `str()`-Aufrufe auf den Zeichenketten die alle schon mal durch `str()` gegangen sind. Auch ein zweiter Aufruf ändert nichts daran das eine Zeichenkette eine Zeichenkette ist und bleibt. Auch ein dritter Aufruf beim `write()` der zusammengesetzten Zeichenkette ändert daran nichts.

Allerdings sollte das nicht alles eine Zeichenkette sein, denn von den vier Werten `start`, `ende`, `zeit`, und `pause` kann man mindestens einen ausrechnen statt ihn vom Benutzer abzufragen. Dazu müssten die aber einen passenden Datentyp haben. Etwas aus dem `datetime`-Modul, denn mit den Datentypen dort kann man mit Datums- und Zeitangaben rechnen.

Um daraus dann wieder Zeichenketten zu machen und die mit anderen Zeichenkettenteilen zu verbinden verwendet man in Python nicht ``+`` und `str()` – das ist eher BASIC – sondern Zeichenkettenformatierung mit der `format()`-Methode oder ab Python 3.6 f-Zeichenkettenliterale.

Diese unglaublich lange Zeile sollte man sinnvoll umbrechen.

Beim öffnen von Textdateien sollte man immer eine Kodierung angeben.

`fileStunden` hält sich nicht an die Namenskonvention: alles_klein_mit_unterstrichen ausser Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Es ist auch kein so komischer Name nötig, man kann das auch beim zweiten mal einfach `file` nennen, denn der Name wird ja nicht mehr für die andere Datei verwendet.

Zwischenstand:

Code: Alles auswählen

#!/usr/bin/env python3
import time


def main():
    kommission = input('Kommission : ')
    ort = input('Ort : ')
    chef = input('Chef : ')
    # 
    # TODO Mindestens ein Wert sollte sich aus den anderen berechnen lassen.
    #   Und eine Überprüfung der Angaben wäre vielleicht sinnvoll, das zum
    #   Beispiel das Arbeitsende nach dem Arbeitsbeginn liegt.
    #   Dazu das `datetime`-Modul benutzen.
    #
    start = input('Arbeitsbeginn : ')
    ende = input('Arbeitsende : ')
    zeit = input('Arbeitszeit : ')
    pause = input('Pause : ')
    
    zeitpunkt = time.strftime('%d.%m.%Y %H:%M:%S')
    eintrag = (
        f'Zeitpunkt des Eintrags: {zeitpunkt}\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\n'
    )
    with open('Arbeitszeitnachweis.txt', 'a', encoding='utf-8') as file:
        file.write(eintrag)
    
    with open('Arbeitsstunden.txt', 'a', encoding='utf-8') as file:
        # 
        # FIXME Das Datum sollte aus dem aktuellen Zeitstempel kommen der nur
        #   *einmal* ermittelt wird, sonst kann es vorkommen das um Mitternacht
        #   herum beide Werte Unterschiedlich sind.  Siehe wieder das
        #   `datetime`-Modul.
        # 
        # TODO Nachdenken ob dieses Format wirklich sinnvoll ist, weil die
        #   Zusätze 'Stunden' und 'mit' die Weiterverarbeitung unnötig
        #   erschweren.  Und wenn das eine CSV-Datei sein soll, wäre das
        #   `csv`-Modul angebracht.
        # 
        file.write(f'{time.strftime("%d.%m.%Y")}\t{zeit} Stunden\tmit {chef}\n')


if __name__ == '__main__':
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

Vielen Dank das du dir die Zeit genommen hast und mir eine Vorlage geschrieben hast die sieht um längen übersichtlicher als mein Code aus und enthält Dinge die ich nicht kannte ich werde mich in die von dir genannten Module einlesen und die todo's abarbeiten
Vielen Dank Pad385
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

Hab etwas dran gemacht aber irgenwie will das nicht funktionieren

Code: Alles auswählen

#!/usr/bin/env python3
import csv
import time
import datetime

def main():
    kommission = input('Kommission : ')
    ort = input('Ort : ')
    chef = input('Chef : ')
    # 
    # TODO Mindestens ein Wert sollte sich aus den anderen berechnen lassen.
    #   Und eine Überprüfung der Angaben wäre vielleicht sinnvoll, das zum
    #   Beispiel das Arbeitsende nach dem Arbeitsbeginn liegt.
    #   Dazu das `datetime`-Modul benutzen.
    #
    #zeitformat = '%H:%M'
    start = input('Arbeitsbeginn : ')
    ende = input('Arbeitsende : ')
    zeit = input('Arbeitszeit : ')
    #zeit = datetime.strptime(ende, zeitformat) - datetime.strptime(start, zeitformat)
    pause = input('Pause : ')
    zeitpunkt = time.strftime('%d.%m.%Y %H:%M:%S')
    eintrag = (
        f'Zeitpunkt des Eintrags: {zeitpunkt}\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'
    )
    with open('Arbeitszeitnachweis.txt', 'a', encoding='utf-8') as file:
        file.write(eintrag)
    
    with open('Arbeitsstunden.csv', 'w') as csv_file:
        writer = csv.writer(csv_file, delimiter=';')
        writer.writerow({'Kommission': '{kommission}', 'Ort': '{ort}', 'Eintrag': '{zeitpunkt}', 'Arbeitszeit': '{zeit}', 'Pause': '{pause}', 'Chef': '{chef}'})

if __name__ == '__main__':
    main()
    
    ### schreiben und speichern fertig ###
# monatlich auswerten, nach Kommission suchen ...
# Stunden ausrechnen
muss ich jetzt einfach den string vor writer.writerow in bytes umwandeln? wie mach ich das ?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pad385: `writerow()` von einem `csv.writer()` erwartet eine Liste/Sequenz von Werten, kein Wörterbuch. Und die Werte in dem Wörterbuch sehen auch falsch aus, denn beispielsweise '{ort}' ist genau diese Zeichenkette: die Buchstaben o, r, und t in geschweifte Klammern eingefasst. Da hättest Du wohl einfach nur den Variablennamen gewollt und keine Zeichenkette die den Variablennamen in geschweiften Klammern enthält. Bei `eintrag` ist das etwas anderes weil das keine normalen Zeichenkettenliterale sind, sondern welche mit einem kleinen f davor, das dafür sorgt das Platzhalter ersetzt werden.

Bei der CSV-Datei möchtest Du relativ sicher auch den „append“-Modus verwenden und eine Kodierung angeben.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

ich bekomm immer nur ein part die values werden nicht geschrieben

Code: Alles auswählen

with open('Arbeitsstunden.csv', 'a', encoding='utf-8') as csv_file:
        writer = csv.writer(csv_file, delimiter=';')
        writer.writerow({'Kommission': kommission, 'Ort': ort, 'Eintrag': zeitpunkt, 'Arbeitszeit': zeit, 'Pause': pause, 'Chef': chef})
oder brauche ich nur die values zu senden ich hab da ne ganz andere lösung alles in ne .txt zu schreiben und die dann umzubennen
jedoch will ich mir das ersparen..
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pad385: Es gilt immer noch der erste Satz meines letzten Beitrags: Das Argument zu `writerow()` ist falsch, das muss eine Liste/Sequenz (`list`, `tuple`, …) sein und kein Wörterbuch (`dict`).
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
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
import datetime

def main():
    kommission = input('Kommission : ')
    ort = input('Ort : ')
    chef = input('Chef : ')
    # 
    # TODO Mindestens ein Wert sollte sich aus den anderen berechnen lassen.
    #   Und eine Überprüfung der Angaben wäre vielleicht sinnvoll, das zum
    #   Beispiel das Arbeitsende nach dem Arbeitsbeginn liegt.
    #   Dazu das `datetime`-Modul benutzen.
    #
    #zeitformat = '%H:%M'
    start = input('Arbeitsbeginn : ')
    ende = input('Arbeitsende : ')
    zeit = input('Arbeitszeit : ')
    #zeit = datetime.strptime(ende, zeitformat) - datetime.strptime(start, zeitformat)
    pause = input('Pause : ')
    zeitpunkt = time.strftime('%d.%m.%Y %H:%M:%S')
    eintrag = (
        f'Zeitpunkt des Eintrags: {zeitpunkt}\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'
    )
    list_eintrag = [kommission, ort, zeitpunkt, zeit, pause, chef]
    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 __name__ == '__main__':
    main()
    
    ### schreiben und speichern fertig ###
# monatlich auswerten, nach Kommission suchen ...
# Stunden ausrechnen
verstanden! was ich nicht versteh wieso gibt er mir eine leere zeile aus ? und wieso verschiebt sich ein teil der zeile nach rechts ? wenn ich " %H:%M:%S" weglasse passt es in die Spalte gibt's da auch ne Lösung ?
edit: ah ich muss die Spalte größer machen ,`)
woher nimmst du dir überhaupt das __name__ in
[/c]
if __name__ == '__main__':
main()

[c]
Zuletzt geändert von Pad385 am Freitag 15. März 2019, 19:38, insgesamt 1-mal geändert.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pad385: Welche leere Zeile? In `Arbeitszeitnachweis.txt`? Weil das so in den Daten steht das da eine leere Zeile am Ende ist‽

Und *wo* verschiebt sich *was* nach rechts?
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

nein in der csv datei

[/csv]
Kommission Ort Eintrag Arbeitszeit Pause Chef
Peter Pleidelsheim 15.03.2019 19:04:55 11 1 Stefan

Augast Freiberg 15.03.2019 19:05:26 9 0 Martin

Martinkirch Ingersheim 15.03.2019 19:06:19 Martin






[csv]
eigentlich auch übersichtlicher aber wieso passsiert das ?
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

[/notepad]
Kommission;Ort;Eintrag;Arbeitszeit;Pause;Chef
Peter;Pleidelsheim;15.03.2019 19:04:55;11;1;Stefan

Augast;Freiberg;15.03.2019 19:05:26;9;0;Martin

Martinkirch;Ingersheim;15.03.2019 19:06:19;;;Martin


[notepad]

ich öffne mit open office falls das ne rolle spielt
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pad385: Was Du mit dem ersten Beitrag sagen möchtest ist mir nicht klar.

Beim zweiten sieht es so aus als wenn Du Python 2 verwendest‽ Dann müsstest das externe `unicodecsv`-Modul verwenden und dort die Kodierung angeben und die Datei im Binärmodus öffnen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

python 3.7irgendwas ist installiert dann verwende ich das doch automatisch auserdem lautet die erste zeile #!/usr/bin/env python3

vergess die zeilen haha ich musste nur die spalte größer machen
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

das datetime Modul versteh ich nicht wie benutze ich .timedelta mit zwei Variablen deren Wert z.B. 18:00 oder 16:30 hat
Zwischenstand:

Code: Alles auswählen

#!/usr/bin/env python3
import csv
import time

def main():
    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 : ')
    zeit = input('Arbeitszeit : ')
    pause = input('Pause : ')
    zeitpunkt = time.strftime('%d.%m.%Y__%H:%M:%S')
    eintrag = (
        f'Zeitpunkt des Eintrags: {zeitpunkt}\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}\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}\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 {rekla_kommissionen}\n'
        f'Reklamationen: {grund}\n\n'
    )
    test = input('Korrekte Eingaben? (JA) : ')
    if test == 'JA':
        if kommission == 'rekla':
            with open('Reklamationen.txt', 'a', encoding='utf-8') as file:
                file.write(rekla_eintrag)
            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)
    else:
        exit()

if __name__ == '__main__':
    main()

### Kommentare ###
# Verschiedene Auftraggeber
# Verschiedene Touren
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Texte für Reklamationen zu erzeugen, die nicht gebraucht werden, ist unsinnig. Warum gibt es die Abfrage `rekla` und gleichzeitig das Wort 'rekla' in kommission. Eins von beiden ist doch überflüssig.
In `list_eintrag` fehlt rekla_kommission.
Du mußt den Code umstellen, dass klar wird, was wann gebraucht wird und nur das gemacht wird.
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

das mit den Reklas stimmt schon wenn alles schief geht fährt man zu einer rekla und nimmt dann eine weitere rekla auf..:/
nein wenn Kommission rekla lautet soll auch in der csv rekla stehen
das Skript funktioniert zur zeit wie es soll nur spiele ich auf den vorschlag von blackjack an mit dem datetime modul zu rechnen
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Und ich spiele darauf an, dass kommission == 'rekla' und rekla == 'ja' immer konsistent sein müssen, damit die Texte, die Du erzeugst Sinn machen. Ergo, ist eine Angabe davon überflüssig.

Zeig doch mal, wie weit Du mit den Zeiten schon gekommen bist, erster Schritt wäre ja, Beginn und Ende mit datetime.datetime.strptime in ein DateTime-Objekt zu überführen.
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

so in etwa ?

Code: Alles auswählen

    time_ende = datetime.strptime(ende, "%H:%M")
    time_start= datetime.strptime(start, "%H:%M")
ich habs verstanden da läuft was nicht richtig..
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ist doch schon ein guter Anfang.
Pad385
User
Beiträge: 39
Registriert: Dienstag 12. März 2019, 18:33

kp wie das gehen soll

zeit = timedelta(time_ende) - timedelta(time_start)


und

time_start= datetime.strptime(start, "%H:%M")

geht auch nicht
Antworten