Dateiverwaltung

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

Dateiverwaltung

Beitragvon TheBombTuber » Samstag 9. September 2017, 16:49

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.

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Sep  5 2017
  4.  
  5. @author: TheBombTuber
  6. """
  7. #Umbau in tkinter ist noch geplant
  8.  
  9. #Import area
  10. import sys, os, time, subprocess
  11. #Import area
  12.  
  13. print("Bevor sie Beginnen legen sie bitte einen Dateitypen fest""\n")
  14. time.sleep(1)
  15. while True:
  16.     print("Vorzugsweise" ' "' ".txt" '"' "\n")
  17.     time.sleep(1)
  18.     print("Sie können jedoch jeden beliebigen Dateityp angeben")
  19.     while True:
  20.         datentyp = input()
  21.         if datentyp == '':
  22.             print("Bitte tätigen sie eine Eingabe")
  23.             time.sleep(1)
  24.             continue
  25.         if '.' in datentyp:
  26.             break
  27.         else:
  28.             print("Datentyp muss einen "'"."'" am Anfang stehen haben")
  29.             continue
  30.     print("Sie haben" + ' "' + datentyp + '" ' + "als Datentyp angegeben.")
  31.     time.sleep(1)
  32.     print("vielen Dank" + "\n" + "Sie gelangen nun in das Menü")
  33.     time.sleep(2)
  34.     os.system("cls")
  35.     break
  36.      
  37. #def area
  38. def add_entry():
  39.     os.system("cls")
  40.     print("Datei hinzufügen"+"\n")
  41.     ###############
  42.     """
  43.    Speicherort auswahl
  44.    in Bearbeitung
  45.    """
  46.     ###############
  47.     time.sleep(0.5)
  48.     while True:
  49.         print("Name der Datei?")
  50.         File = input() + (datentyp)
  51.         try:
  52.             open(File, "r")
  53.             print("Datei bereits vorhanden!""\n""Möchten Sie sie überschreiben?""\n""Ja oder Nein?")
  54.             while True:
  55.                 überschreiben = input()
  56.                 if überschreiben == 'Ja':
  57.                     open(File, 'w')
  58.                     time.sleep(0.5)
  59.                     print("Datei wurde überschrieben")
  60.                     break
  61.                 if überschreiben == 'Nein':
  62.                     break
  63.                 else:
  64.                     print('Bitte schreiben sie "Ja" oder "Nein" nicht ' + überschreiben)
  65.                     time.sleep(1)
  66.                     os.system('cls')
  67.                     continue
  68.             break
  69.         except FileNotFoundError:
  70.             open(File, 'w')
  71.             time.sleep(0.5)
  72.             print('Datei ' + '"' + File + '"' + ' erstellt')
  73.             break
  74.         continue
  75.     while True:
  76.         print("Sie kehren zurück ins Menü")
  77.         time.sleep(1.5)
  78.         os.system("cls")
  79.         break
  80.  
  81.  
  82. def search_entry():
  83.     os.system("cls")
  84.     print("Dateien des Typ's " + datentyp + " werden gesucht""\n")
  85.     time.sleep(0.5)
  86.     dirList = os.listdir('.')
  87.     dirList.sort()
  88.     newList = []
  89.     for sFile in dirList:
  90.         if sFile.find(datentyp) == -1:
  91.             continue
  92.  
  93.         newList.append(sFile)
  94.  
  95.     for sFile in newList:
  96.         print(sFile)
  97.         time.sleep(0.2)
  98.     time.sleep(2)
  99.    
  100.     print("\n""Drücken sie "'"Enter"'" um zurück ins Menü zu gelangen")
  101.     while True:
  102.         zurückinMenü = input()
  103.         if zurückinMenü == '':
  104.             print("Sie kehren zurück ins Menü")
  105.             time.sleep(1.5)
  106.             os.system("cls")
  107.             break
  108.  
  109.  
  110. def change_entry():
  111.     os.system("cls")
  112.     print("Datei bearbeiten""\n")
  113.     time.sleep(0.5)
  114.     batchdatei = (" .bat")
  115.     filepath = ((os.path.dirname(sys.argv[0]) + "/" + batchdatei))
  116.     while True:
  117.         dirList = os.listdir('.')
  118.         dirList.sort()
  119.         newList = []
  120.         for sFile in dirList:
  121.             if sFile.find(datentyp) == -1:
  122.                 continue
  123.    
  124.             newList.append(sFile)
  125.    
  126.         for sFile in newList:
  127.             print(sFile)
  128.             time.sleep(0.2)
  129.         print("Welche Datei möchten sie bearbeitet?")
  130.         auswahldatei = input() + (datentyp)
  131.         print(auswahldatei + ' wird aufgerufen')
  132.        
  133.         time.sleep(1)
  134.         direction = ((os.path.dirname(sys.argv[0]) + "/" + auswahldatei))
  135.  
  136.         bat = open(' .bat', 'w')
  137.         bat.write(str('notepad' + ' ' + direction))
  138.         bat.close()
  139.         time.sleep(1)
  140.         break
  141.     while True:
  142.         p = subprocess.Popen(filepath, shell=True, stdout = subprocess.PIPE)
  143.         stdout, stderr = p.communicate()
  144.         time.sleep(1)
  145.         break
  146.     while True:
  147.         print("Sie kehren zurück ins Menü")
  148.         os.remove(filepath)
  149.         time.sleep(1.5)
  150.         os.system("cls")
  151.         break
  152.  
  153.  
  154. def remove_entry():
  155.     while True:
  156.         os.system("cls")
  157.         dirList = os.listdir('.')
  158.         dirList.sort()
  159.         newList = []
  160.        
  161.         for sFile in dirList:
  162.             if sFile.find(datentyp) == -1:
  163.                 continue
  164.    
  165.             newList.append(sFile)
  166.            
  167.         for sFile in newList:
  168.             print("verfügbare Dateien""\n")
  169.             print(sFile)
  170.             time.sleep(0.2)
  171.            
  172.         print("\nWelche Datei löschen?""\n")
  173.         try:
  174.             zulöschen = input() + (datentyp)
  175.             os.remove(zulöschen)
  176.             print("Datei wurde entfernt")
  177.             time.sleep(1)
  178.             break
  179.         except FileNotFoundError:
  180.             print("Datei " + zulöschen + " existiert nicht")
  181.             print("Eingabe Bitte wiederholen")
  182.             time.sleep(1)
  183.             continue
  184.  
  185.  
  186.     while True:
  187.         print("Sie kehren zurück ins Menü")
  188.         time.sleep(1.5)
  189.         os.system("cls")
  190.         break
  191.  
  192.  
  193. def quit_entry():
  194.     os.system("cls")
  195.     print("Programm wird beendet")
  196.     time.sleep(1)
  197.     sys.exit()
  198.  
  199.  
  200. def handle_menu(menu):
  201.     while True:
  202.         try:
  203.             for index, item in enumerate(menu, 1):
  204.                 print("{}  {}".format(index, item[0]))
  205.             choice = int(input("Ihre Wahl? ")) - 1
  206.             if 0 <= choice < len(menu):
  207.                 menu[choice][1]()
  208.             else:
  209.                 print("Bitte nur Zahlen im Bereich 1 - {} eingeben".format(len(menu)))
  210.                 time.sleep(1)
  211.                 os.system('cls')
  212.         except ValueError:
  213.             break        
  214. #def area
  215.  
  216.  
  217. #Menu area
  218. menu = [
  219.       ["Datei hinzufügen", add_entry],
  220.       ["Datei löschen", remove_entry],
  221.       ["Dateien anzeigen", search_entry],
  222.       ["Datei bearbeiten", change_entry],
  223.       ["Programm beenden", quit_entry]
  224.       ]
  225.  
  226. handle_menu(menu)
  227. #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: 6251
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: Dateiverwaltung

Beitragvon Sirius3 » Samstag 9. September 2017, 17:33

@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:
  1. def change_entry(datentyp):
  2.     os.system("cls")
  3.     print("Datei bearbeiten\n")
  4.     time.sleep(0.5)
  5.  
  6.     filenames = os.listdir('.')
  7.     filenames.sort()
  8.     for filename in filenames:
  9.         if filename.endswith(datentyp):
  10.             print(filename)
  11.             time.sleep(0.2)
  12.     print("Welche Datei möchten sie bearbeitet?")
  13.     auswahldatei = input() + datentyp
  14.     print('{} wird aufgerufen'.format(auswahldatei))
  15.    
  16.     time.sleep(1)
  17.     subprocess.call(["notepad", auswahldatei])
  18.     time.sleep(1)
  19.  
  20.     print("Sie kehren zurück ins Menü")
  21.     time.sleep(1.5)
  22.     os.system("cls")

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder