Seite 1 von 1

Modulariesierung

Verfasst: Montag 17. August 2020, 15:02
von jve
Hallo Zusammen,
Wie man sieht habe ich ein Pragramm als nur eine funktion geschrieben.
ich möchte jetzt gerne den Gesamtcode in mehrere Funktionen bzw. Module aufteilen und dann über eine main() laufen lassen.
Leider habe ich keinen blassen schimmer wie ich das anstellen soll....
Vielleicht kann mir jemand von euch helfen.

Danke und beste Grüße

Code: Alles auswählen


import os, sys

def user_input():

    found_s = False 
    found = False
    name = False
    directory = None
    selection = None
    dir_file_name = None
    list = []

    while not found:
        
        directory = input ("Verzeichnispfad eingeben oder abbrechen mit (x):")
        print()
    
        if directory == "x":
            user_input()
        elif not os.path.isdir(directory):
            print(directory, 'ist kein korrekter Verzeichnispfad! Verzeichnispfad erneut eingeben')
        else:
            print("Verzeichnispfad ist korrekt!")
            found = True
            print()
     
    if found == True:
        while not found_s:

            selection = input("Anzahl der Verzeichnisse/Dateien anzeigen? für |ja| = 1 und für |nein| = 2 eingeben:")
            print()
            if selection == '2':
                user_input()
            elif selection != "1" and "2":
                print(selection, "Ist keine korrekte Eingabe. Bitte erneut eingeben!")
                print()

            else:
                num_Files = 0
                num_Dir = 0
                for root, dirs, files in os.walk(directory):
                    #print('Schaue in : ',base)
                    for directories in dirs:
                        num_Dir += 1
                        list.append(root + '\\' + directories)
                    for Files in files:
                        num_Files += 1
                        list.append(root + '\\' + Files)
                print('Anzahl Dateien: \n',num_Files)
                print('Anzahl Verzeichnisse: \n',num_Dir)
                print('Total: \n',(num_Dir + num_Files))
            if num_Dir == 0:
                print("Durchschnitt Dateien in Verzeichnissen: Verzeichnisse = 0! Keine Angabe!")
            else:
                print('Durchschnitt Dateien in Verzeichnissen: \n', (num_Files/ num_Dir))
            found_s = True

    if found_s == True:
        while not name:
            dir_file_name = input("Namen der Verzeichnisse/Dateien anzeigen? für |ja| = 1 und für |nein| = 2 eingeben:")
            print()
            if dir_file_name == '2':
                user_input()
            elif selection != "1" and "2":
                print(selection, "Ist keine korrekte Eingabe. Bitte erneut eingeben!")
            else:
                entries = os.listdir(directory)
                for entry in entries:
                    if os.path.isdir(os.path.join(directory, entry)):
                        print("Verzeichnis:", entry)
                for entry_2 in os.listdir(directory):
                    if os.path.isfile(os.path.join(directory, entry_2)):
                        print("Datei:", entry_2)
                        name = True
            

                if os.access(directory, os.R_OK):
                    print("Leserechte bestehen.")
                else:
                    print("Leserechte bestehen nicht.")
                if os.access(directory, os.W_OK):
                    print("Schreibrechte bestehen.")
                else:
                    print("Schreibrechte bestehen nicht.")
                name = True

    while True:
        again = input('Programm nochmal ausführen? |ja| = 1 und |nein| = 2: \n')
        if again in ('1', '2'):
            break
        print("Eingabe ist ungültig")
    if again == '1':
        user_input()
    else:
        print("Tschüss")
        

Re: Modulariesierung

Verfasst: Montag 17. August 2020, 15:48
von Sirius3
Variablen definiert man dann, wenn man sie braucht und nicht schon etliche Zeilen davor. Variablennamen schreibt man komplett klein. Die ganzen while-Schleifen sind eigentlich while-True-Schleifen, die an der passenden Stelle per break verlassen werden. Damit fallen auch die if weg, die eh immer betreten werden, weil z.B. found nach der while-Schleife immer True ist.
Das Verzeichnis darf nicht x heißen. Das ist blöd. x führt auch gar nicht zu einem Abbruch, sondern ruft user_input rekursiv auf. Das ist ein Programmierfehler, denn hier soll ja gar kein rekursives Problem gelöst werden. Der gleiche Fehler kommt noch 4mal vor. Sowas löst man durch eine main-Funktion die die einzelnen while- Schleifen in Funktionen ausgelagert aufruft und deren Rückgabewert verarbeitet.
`selection != "1" and "2"` tut nicht das was du denkst. Dafür ist der in-Operator da.
Die Methoden aus os und os.path benutzt man nicht mehr, stattdessen gibt es pathlib.Path.

Re: Modulariesierung

Verfasst: Dienstag 18. August 2020, 09:34
von jve
ich habe jetzt den Code in mehrer Funktionen ausgelagert, soweit wie mir möglich -- :) absoluter Anfänger --
Jetzt läuft das Prgramm nur wen ich die inputs mit ja bzw. 1 bestätige.
Bei einer falschen Eingabe oder Programm abbrechen bzw. neustarten gelange ich teilweise in eine Dauerschleife.

Code: Alles auswählen

import os

def check_path(ein_pfad):
    found = False
    while not found:
        if ein_pfad == "x":
            main()
        elif not os.path.isdir(ein_pfad):
            print(ein_pfad, 'ist kein korrekter Verzeichnispfad! Verzeichnispfad erneut eingeben')
        else:
            print("Verzeichnispfad ist korrekt!")
            found = True
            print()

def num_dir_file(ein_pfad):
    
    num_Files = 0
    num_Dir = 0
    for root, dirs, files in os.walk(ein_pfad):
        #print('Schaue in : ',base)
        for directories in dirs:
            num_Dir += 1
            #list.append(root + '\\' + directories)
        for Files in files:
            num_Files += 1
            #list.append(root + '\\' + Files)
    print('Anzahl Dateien: \n',num_Files)
    print('Anzahl Verzeichnisse: \n',num_Dir)
    print('Total: \n',(num_Dir + num_Files))
    if num_Dir == 0:
        print("Durchschnitt Dateien in Verzeichnissen: Verzeichnisse = 0! Keine Angabe!")
    else:
        print('Durchschnitt Dateien in Verzeichnissen: \n', (num_Files/ num_Dir))
        
def name_dir_file(ein_pfad):
    entries = os.listdir(ein_pfad)
    for entry in entries:
        if os.path.isdir(os.path.join(ein_pfad, entry)):
            print("Verzeichnis:", entry)
    for entry_2 in os.listdir(ein_pfad):
        if os.path.isfile(os.path.join(ein_pfad, entry_2)):
            print("Datei:", entry_2)
                       
def main():
    directory = None
    directory = input ("Verzeichnispfad eingeben oder mit |x| abbrechen") 
    check_path(directory)
    selection = input("Anzahl der Verzeichnisse/Dateien anzeigen? für |ja| = 1 und für |nein| = 2 eingeben:")
    print()
    if selection == '2':
        main()
    elif selection != "1" and "2":
        print(selection, "Ist keine korrekte Eingabe. Bitte erneut eingeben!")
        print()
    else:
        num_dir_file(directory)
    dir_file_name = input("Namen der Verzeichnisse/Dateien anzeigen? für |ja| = 1 und für |nein| = 2 eingeben:")
    print()
    if dir_file_name == '2':
        main()
    elif selection != "1" and "2":
        print(selection, "Ist keine korrekte Eingabe. Bitte erneut eingeben!")
    else:
        name_dir_file(directory)
if __name__ == "__main__":
    main()



Re: Modulariesierung

Verfasst: Dienstag 18. August 2020, 09:39
von Jankie
Deine if-Abfrage ist hier falsch.

Code: Alles auswählen

elif selection != "1" and "2"
müsste

Code: Alles auswählen

elif selection != "1" and selection != "2"
heißen.

Alternativ:

Code: Alles auswählen

elif selection not in ["1","2"]

Re: Modulariesierung

Verfasst: Dienstag 18. August 2020, 10:00
von Sirius3
Wie ich schon geschrieben hatte: die rekursiven Aufrufe sind falsch. In check_path darf nicht main aufgerufen werden. Die Schleife macht fast keinen Sinn, wenn es keinen Input gibt. Die Funktion wäre also besser

Code: Alles auswählen

def input_path():
    while True:
        directory = input("Verzeichnispfad eingeben oder mit |x| abbrechen") 
        if directory == "x":
            return None
        elif not os.path.isdir(directory):
            print(f'{directory} ist kein korrekter Verzeichnispfad! Verzeichnispfad erneut eingeben')
        else:
            print("Verzeichnispfad ist korrekt!")
            return directory
Jetzt wird entweder ein Verzeichnisstring zurückgegeben oder None bei Abbruch, so das man in main entsprechend reagieren kann.
Obwohl Abbruch bei dir heißt, dass man nur wieder ein Verzeichnis eingeben muss, so dass diese Option gleich ganz wegfallen kann.

Meine restlichen Anmerkungen hast du ja auch nicht umgesetzt, so dass ich sie nicht wiederholen muss.