Dateiverwaltung

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
TheBombTuber
User
Beiträge: 41
Registriert: Samstag 9. September 2017, 15:48

Ich habe mal um ein bisschen Python zu Üben ein kleines Programm geschrieben, welches einem eine Möglichkeit gibt Textdateien, direkt aus einem Menü heraus, zu verwalten.
Da ich noch recht neu bin in der großen Welt von Python :mrgreen: wollte ich einfach mal einige Meinungen zur Verbesserung des Codes und allgemeiner Ideen für weitere Funktionen einholen.

Code: Alles auswählen

# -*- coding: utf-8 -*-
"""
Created on Sep  5 2017

@author: TheBombTuber
"""
#Umbau in tkinter ist noch geplant

#Import area 
import sys, os, time, subprocess
#Import area

print("Bevor sie Beginnen legen sie bitte einen Dateitypen fest""\n")
time.sleep(1)
while True:
    print("Vorzugsweise" ' "' ".txt" '"' "\n")
    time.sleep(1)
    print("Sie können jedoch jeden beliebigen Dateityp angeben")
    while True:
        datentyp = input()
        if datentyp == '':
            print("Bitte tätigen sie eine Eingabe")
            time.sleep(1)
            continue
        if '.' in datentyp:
            break
        else:
            print("Datentyp muss einen "'"."'" am Anfang stehen haben")
            continue
    print("Sie haben" + ' "' + datentyp + '" ' + "als Datentyp angegeben.")
    time.sleep(1)
    print("vielen Dank" + "\n" + "Sie gelangen nun in das Menü")
    time.sleep(2)
    os.system("cls")
    break
      
#def area
def add_entry():
    os.system("cls")
    print("Datei hinzufügen"+"\n")
    ###############
    """
    Speicherort auswahl
    in Bearbeitung
    """
    ###############
    time.sleep(0.5)
    while True:
        print("Name der Datei?")
        File = input() + (datentyp)
        try:
            open(File, "r")
            print("Datei bereits vorhanden!""\n""Möchten Sie sie überschreiben?""\n""Ja oder Nein?")
            while True:
                überschreiben = input()
                if überschreiben == 'Ja':
                    open(File, 'w')
                    time.sleep(0.5)
                    print("Datei wurde überschrieben")
                    break
                if überschreiben == 'Nein':
                    break
                else:
                    print('Bitte schreiben sie "Ja" oder "Nein" nicht ' + überschreiben)
                    time.sleep(1)
                    os.system('cls')
                    continue
            break
        except FileNotFoundError:
            open(File, 'w')
            time.sleep(0.5)
            print('Datei ' + '"' + File + '"' + ' erstellt')
            break
        continue
    while True:
        print("Sie kehren zurück ins Menü")
        time.sleep(1.5)
        os.system("cls")
        break


def search_entry():
    os.system("cls")
    print("Dateien des Typ's " + datentyp + " werden gesucht""\n")
    time.sleep(0.5)
    dirList = os.listdir('.')
    dirList.sort()
    newList = []
    for sFile in dirList:
        if sFile.find(datentyp) == -1:
            continue

        newList.append(sFile)

    for sFile in newList:
        print(sFile)
        time.sleep(0.2)
    time.sleep(2)
    
    print("\n""Drücken sie "'"Enter"'" um zurück ins Menü zu gelangen")
    while True:
        zurückinMenü = input()
        if zurückinMenü == '':
            print("Sie kehren zurück ins Menü")
            time.sleep(1.5)
            os.system("cls")
            break


def change_entry():
    os.system("cls")
    print("Datei bearbeiten""\n")
    time.sleep(0.5)
    batchdatei = (" .bat")
    filepath = ((os.path.dirname(sys.argv[0]) + "/" + batchdatei))
    while True:
        dirList = os.listdir('.')
        dirList.sort()
        newList = []
        for sFile in dirList:
            if sFile.find(datentyp) == -1:
                continue
    
            newList.append(sFile)
    
        for sFile in newList:
            print(sFile)
            time.sleep(0.2)
        print("Welche Datei möchten sie bearbeitet?")
        auswahldatei = input() + (datentyp)
        print(auswahldatei + ' wird aufgerufen')
        
        time.sleep(1)
        direction = ((os.path.dirname(sys.argv[0]) + "/" + auswahldatei))

        bat = open(' .bat', 'w')
        bat.write(str('notepad' + ' ' + direction))
        bat.close()
        time.sleep(1)
        break
    while True:
        p = subprocess.Popen(filepath, shell=True, stdout = subprocess.PIPE)
        stdout, stderr = p.communicate()
        time.sleep(1)
        break
    while True:
        print("Sie kehren zurück ins Menü")
        os.remove(filepath)
        time.sleep(1.5)
        os.system("cls")
        break


def remove_entry(): 
    while True:
        os.system("cls")
        dirList = os.listdir('.')
        dirList.sort()
        newList = []
        
        for sFile in dirList:
            if sFile.find(datentyp) == -1:
                continue
    
            newList.append(sFile)
            
        for sFile in newList:
            print("verfügbare Dateien""\n")
            print(sFile)
            time.sleep(0.2)
            
        print("\nWelche Datei löschen?""\n")
        try:
            zulöschen = input() + (datentyp)
            os.remove(zulöschen)
            print("Datei wurde entfernt")
            time.sleep(1)
            break
        except FileNotFoundError:
            print("Datei " + zulöschen + " existiert nicht")
            print("Eingabe Bitte wiederholen")
            time.sleep(1)
            continue


    while True:
        print("Sie kehren zurück ins Menü")
        time.sleep(1.5)
        os.system("cls")
        break


def quit_entry():
    os.system("cls")
    print("Programm wird beendet")
    time.sleep(1)
    sys.exit()


def handle_menu(menu):
    while True:
        try:
            for index, item in enumerate(menu, 1):
                print("{}  {}".format(index, item[0]))
            choice = int(input("Ihre Wahl? ")) - 1
            if 0 <= choice < len(menu):
                menu[choice][1]()
            else:
                print("Bitte nur Zahlen im Bereich 1 - {} eingeben".format(len(menu)))
                time.sleep(1)
                os.system('cls')
        except ValueError:
            break        
#def area


#Menu area
menu = [
      ["Datei hinzufügen", add_entry],
      ["Datei löschen", remove_entry],
      ["Dateien anzeigen", search_entry],
      ["Datei bearbeiten", change_entry],
      ["Programm beenden", quit_entry]
      ]

handle_menu(menu)
#Menu area
Bereits einmal vielen Dank im voraus und ich hoffe, dass ihr nicht sofort beim ersten drüberschauen vor Verzweiflung im Boden versinkt :mrgreen:
Mit freundlichen Grüßen
TheBombTuber
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@TheBombTuber: auf den ersten Blick sieht das schon sehr gut aus. Was Du Dir sofort abgewöhnen solltest, ist das zusammenstückeln von Strings. Es gibt ' " und ''' bzw. """ um einen String einzuschließen. Also statt »"Vorzugsweise" ' "' ".txt" '"' "\n"« liest sich »'Vorzugsweise ".txt"\n'« viel besser. Bei Variablen, benutze Stringformatierung: »'Sie haben "{}" als Datentyp angegeben.'.format(datentyp)«.

Zeilen 13 bis 35 gehören auch in eine Funktion. In Zeile 25 prüfst Du ob irgendwo ein '.' in datentyp vorkommt, schreibst aber zwei Zeilen später, dass datentyp mit einem '.' beginnen soll. Das ist inkonsistent.
Zeile 42: mehrzeilige Strings sind kein Ersatz für Kommentare.
Zeile 48: die while-Schleife wird immer beim ersten Durchlauf mit »break« verlassen. Kann also weg. »continue« ist als letzte Anweisung auch überflüssig und sollte generell vermieden werden, weil es den Programmfluß undurchsichtig macht.
Zeile 50: datentyp wird in der Funktion verwendet, ohne dass es als Parameter übergeben wird. Alles was ein einer Funktion an Variablen verwendet werden, muß als Argument übergeben werden. Variablen werden komplett klein geschrieben. »File« ist auch zu unpräzise, es handelt sich ja um einen »filename«.
Zeile 52: zum Testen, ob es sich um eine Datei handelt gibt es »os.path.isfile«.
Zeile 75: siehe Zeile 48.

Zeile 90: statt »find« ist »not in« besser. Oder noch besser, die Bedingung invertieren und dadruch continue vermeiden.
Zeile 114: was sollen die Klammern, was soll das Leerzeichen?
Zeile 115: Pfade werden mit os.path.join zusammengefügt.
Zeile 134: Du listest die Dateien im aktuellen Verzeichnis auf, baust aber dann einen Dateinamen auf, der relativ zum aufrufgerufenen Skript ist. Das muß nicht das selbe sein, ist also falsch.
Zeile 136: Dateien mit dem with-Statement öffnen.
Zeile 137: `str` ist unnötig, da es sich schon um einen String handelt.
Zeile 142: warum überhaupt die bat-Datei und nicht direkt starten? stdout wird nicht verwendet. filepath sollte eine Liste sein und shell=True weggelassen werden; das sähe dann so aus:

Code: Alles auswählen

def change_entry(datentyp):
    os.system("cls")
    print("Datei bearbeiten\n")
    time.sleep(0.5)

    filenames = os.listdir('.')
    filenames.sort()
    for filename in filenames:
        if filename.endswith(datentyp):
            print(filename)
            time.sleep(0.2)
    print("Welche Datei möchten sie bearbeitet?")
    auswahldatei = input() + datentyp
    print('{} wird aufgerufen'.format(auswahldatei))
    
    time.sleep(1)
    subprocess.call(["notepad", auswahldatei])
    time.sleep(1)

    print("Sie kehren zurück ins Menü")
    time.sleep(1.5)
    os.system("cls")
Antworten