Ordner mit bestimmten Namen suchen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
TheBombTuber
User
Beiträge: 49
Registriert: Samstag 9. September 2017, 15:48

Hallo,

gibt es eine Möglichkeit wie ich einen Verzeichnis Ordner mit einem bestimmten Namen löschen kann?

Ich habe bisher nichts gefunden was wirklich verlässlich funktioniert.

Vielen Dank im voraus.

Mit freundlichen Grüßen
TheBombTuber
TheBombTuber
User
Beiträge: 49
Registriert: Samstag 9. September 2017, 15:48

TheBombTuber hat geschrieben: Montag 3. Dezember 2018, 13:28 Hallo,

gibt es eine Möglichkeit wie ich einen Verzeichnis Ordner mit einem bestimmten Namen löschen kann?

Ich habe bisher nichts gefunden was wirklich verlässlich funktioniert.

Vielen Dank im voraus.

Mit freundlichen Grüßen
TheBombTuber

Mir ist gerade aufgefallen, dass ich die Frage sehr offen formuliert habe.

Um es also noch einmal etwas zu spezifizieren:

Ich möchte das mir aus einem Verzeichnis alle Ordner gelöscht werden welche z.B. das Wort "Test" in ihrem Namen haben.

Also, dass das Skript die Ordner "Test1", "Test_1", "Test2" aus dem Verzeichnis löschen würde
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Suchst Du jetzt einen Ordner mit bestimmtem Namen oder willst Du ihn löschen. Und enthält der Ordner noch Daten (shutil.rmtree) oder ist er schon leer (os.rmdir).
Und was heißt `verlässlich funktioniert`? Was hast Du versucht und was ist der Fehler?

EDIT: also suchst Du glob.
TheBombTuber
User
Beiträge: 49
Registriert: Samstag 9. September 2017, 15:48

Sirius3 hat geschrieben: Montag 3. Dezember 2018, 14:12 Suchst Du jetzt einen Ordner mit bestimmtem Namen oder willst Du ihn löschen. Und enthält der Ordner noch Daten (shutil.rmtree) oder ist er schon leer (os.rmdir).
Und was heißt `verlässlich funktioniert`? Was hast Du versucht und was ist der Fehler?

EDIT: also suchst Du glob.
Ich suche die Ordner um sie zu löschen.

Der Pfad in dem ich suche ist fest und lautet "C:\cad\VWG\catia\vwgrclite\opt\aft"
Gelöscht werden sollen daraus alle Ordner welche "CONNECT_" im Namen haben
In den Ordnern "CONNECT_" befinden sich noch Daten.

Getestet habe ich ein Skript aus einem anderen Beitrag viewtopic.php?f=1&t=37764&hilit=Ordner+ ... mten+namen aber es ist zu ungenau (oder ich wende es falsch an)

Code: Alles auswählen

import os


def get_folders(base_dir, search_name):
    for dir_name, sub_directories, filenames in os.walk(base_dir):
        if search_name in sub_directories:
            return os.path.join(dir_name)


def main():
    root_dir = 'C:\\'
    seek_dir = 'VLC'
    dir_name = get_folders(root_dir, 'VLC')
    print(dir_name + '\\' + seek_dir + '\\')


if __name__ == "__main__":
    main()
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@TheBombTuber: das was Du da zusammenkopiert hast, ist ja noch eine sehr frühe Version mit vielen Fehlern und auch nicht auf Dein Problem anwendbar.

Trotzdem solltest Du erklären, warum das Ergebnis zu ungenau ist. Denn sonst muß sich jeder selbst zusammenreimen, was Du damit meinst.

Wie schon geschrieben, Du suchst nach `glob` und `shutil.rmtree`.
TheBombTuber
User
Beiträge: 49
Registriert: Samstag 9. September 2017, 15:48

Sirius3 hat geschrieben: Montag 3. Dezember 2018, 14:56 @TheBombTuber: das was Du da zusammenkopiert hast, ist ja noch eine sehr frühe Version mit vielen Fehlern und auch nicht auf Dein Problem anwendbar.

Trotzdem solltest Du erklären, warum das Ergebnis zu ungenau ist. Denn sonst muß sich jeder selbst zusammenreimen, was Du damit meinst.

Wie schon geschrieben, Du suchst nach `glob` und `shutil.rmtree`.
Ich habe nun eine Lösung für mein Problem. Ich suche erst mit einem regulärem ausdruck nach allem was CONNECT enthält lasse mir die nacheinander mit .group() aufrufen und löschen. sieht folgendermaßen aus.

Code: Alles auswählen

# -*- coding: utf-8 -*-
"""
Created on Mon Dec  3 08:26:39 2018

@author: cpohlmann
"""

import os, time, sys, shutil, re


if os.path.isdir(r"C:\cad\VWG\catia\vwgrclite\opt\aft"):
    try:
    #hier kommt das Löschen
        while True:
            try:
                os.chdir(r'C:\cad\VWG\catia\vwgrclite\opt\aft')
                files = os.listdir()
                x = re.search(r"CONNECT\w+",str(files))
                s = x.group()
                if os.path.isdir(r"C:\cad\VWG\catia\vwgrclite\opt\aft" +"\\" + s):
                    print(r"C:\cad\VWG\catia\vwgrclite\opt\aft" +"\\" + s + " wird entfernt")
                    time.sleep(2)
                    shutil.rmtree(s)
                    time.sleep(2)
                    continue
            except AttributeError:
                break
        shutil.rmtree(r"C:\cad\VWG\catia\vwgrclite\opt\aft\CONNECT_11043_5")
        shutil.copytree(r"\\srv-23v-isea-01\temp\CPO\IT\Connect update\windows\components\cnctclientw-aftconnect\data\CONNECT_12010_4", r"C:\cad\VWG\catia\vwgrclite\opt\aft\CONNECT_12010_4")
        time.sleep(2)
        print("Austausch erfolgreich")
        sys.exit()
    except FileNotFoundError:
        shutil.copytree(r"\\srv-23v-isea-01\temp\CPO\IT\Connect update\windows\components\cnctclientw-aftconnect\data\CONNECT_12010_4", r"C:\cad\VWG\catia\vwgrclite\opt\aft\CONNECT_12010_4")
        print("Austausch erfolgreich")
        sys.exit()
elif os.path.isdir(r"C:\CATIAV5\VWG\catia\vwgrclite\opt\aft"):
    try:
        while True:
            try:
                os.chdir(r'C:\CATIAV5\VWG\catia\vwgrclite\opt\aft')
                files2 = os.listdir()
                x2 = re.search(r"CONNECT\w+",str(files2))
                s2 = x2.group()
                if os.path.isdir(r"C:\cad\VWG\catia\vwgrclite\opt\aft" +"\\" + s2):
                    print(r"C:\cad\VWG\catia\vwgrclite\opt\aft" +"\\" + s2 + " wird entfernt")
                    time.sleep(2)
                    shutil.rmtree(s2)
                    time.sleep(2)
                    continue
            except AttributeError:
                break
        shutil.rmtree(r"C:\CATIAV5\VWG\catia\vwgrclite\opt\aft\CONNECT_11043_5")
        shutil.copytree(r"\\srv-23v-isea-01\temp\CPO\IT\Connect update\windows\components\cnctclientw-aftconnect\data\CONNECT_12010_4", r"C:\CATIAV5\VWG\catia\vwgrclite\opt\aft\CONNECT_12010_4")
        time.sleep(2)
        print("Austausch erfolgreich")
        sys.exit()
    except FileNotFoundError:
        shutil.copytree(r"\\srv-23v-isea-01\temp\CPO\IT\Connect update\windows\components\cnctclientw-aftconnect\data\CONNECT_12010_4", r"C:\CATIAV5\VWG\catia\vwgrclite\opt\aft\CONNECT_12010_4")
        print("Austausch erfolgreich")
        sys.exit()
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Was hat bei `glob` nicht funktioniert?

Zu Deinem jetzigen Programm: Du hast zwei identische Blöcke, das löst man mit einer Funktion. `os.chdir` sollte nicht verwendet werden, weil es einen globalen Zustand ändert und listdir auch einen Parameter mit dem Pfad unterstützt.
Die String-Representation einer Liste ist nur für Debug-Zwecke da, nicht um darin mit regulären Ausdrücken zu suchen. Wenn ein Regulärer Ausdruck nicht gefunden wird, dann prüft man auf den Rückgabewert None und fängt nicht den AttributError ab; das ist total undurchsichtig.
Was sollen die sleep?

Statt der while-Schleife solltest Du einfach eine for-Schleife benutzen. Es ist doch umständlich, jedes mal wieder das gesamte Verzeichnis zu durchsuchen, nur um wieder den ersten CONNECT-Eintrag zu finden.

Was ist denn das besondere an `CONNECT_11043_5` dass Du das noch extra löschen willst? Wenn die Schleife funktioniert, sollte es schon weg sein.

sys.exit hat in einem ordenlichen Programm nichts zu suchen.

Code: Alles auswählen

# -*- coding: utf-8 -*-
import os
import time
import sys
import shutil
import re

def remove_files(path):
    for filename in os.listdir(path):
        if filename.startswith('CONNECT'):
            print(os.path.join(path, filename) + " wird entfernt")
            shutil.rmtree(os.path.join(path, filename))

for path in [
    r"C:\cad\VWG\catia\vwgrclite\opt\aft",
    r"C:\CATIAV5\VWG\catia\vwgrclite\opt\aft",
]:
    if os.path.isdir(path):
        remove_files(path)
        shutil.copytree(r"\\srv-23v-isea-01\temp\CPO\IT\Connect update\windows\components\cnctclientw-aftconnect\data\CONNECT_12010_4", os.path.join(path, 'CONNECT_12010_4'))
        print("Austausch erfolgreich")
        break
oder eben mit `glob`:

Code: Alles auswählen

def remove_files(path):
    for filename in glob.glob(os.path.join(path, 'CONNECT*'):
        print("{} wird entfernt".format(filename))
        shutil.rmtree(filename)
TheBombTuber
User
Beiträge: 49
Registriert: Samstag 9. September 2017, 15:48

Sirius3 hat geschrieben: Montag 3. Dezember 2018, 18:28 Was hat bei `glob` nicht funktioniert?

Zu Deinem jetzigen Programm: Du hast zwei identische Blöcke, das löst man mit einer Funktion. `os.chdir` sollte nicht verwendet werden, weil es einen globalen Zustand ändert und listdir auch einen Parameter mit dem Pfad unterstützt.
Die String-Representation einer Liste ist nur für Debug-Zwecke da, nicht um darin mit regulären Ausdrücken zu suchen. Wenn ein Regulärer Ausdruck nicht gefunden wird, dann prüft man auf den Rückgabewert None und fängt nicht den AttributError ab; das ist total undurchsichtig.
Was sollen die sleep?

Statt der while-Schleife solltest Du einfach eine for-Schleife benutzen. Es ist doch umständlich, jedes mal wieder das gesamte Verzeichnis zu durchsuchen, nur um wieder den ersten CONNECT-Eintrag zu finden.

Was ist denn das besondere an `CONNECT_11043_5` dass Du das noch extra löschen willst? Wenn die Schleife funktioniert, sollte es schon weg sein.

sys.exit hat in einem ordenlichen Programm nichts zu suchen.

Code: Alles auswählen

# -*- coding: utf-8 -*-
import os
import time
import sys
import shutil
import re

def remove_files(path):
    for filename in os.listdir(path):
        if filename.startswith('CONNECT'):
            print(os.path.join(path, filename) + " wird entfernt")
            shutil.rmtree(os.path.join(path, filename))

for path in [
    r"C:\cad\VWG\catia\vwgrclite\opt\aft",
    r"C:\CATIAV5\VWG\catia\vwgrclite\opt\aft",
]:
    if os.path.isdir(path):
        remove_files(path)
        shutil.copytree(r"\\srv-23v-isea-01\temp\CPO\IT\Connect update\windows\components\cnctclientw-aftconnect\data\CONNECT_12010_4", os.path.join(path, 'CONNECT_12010_4'))
        print("Austausch erfolgreich")
        break
oder eben mit `glob`:

Code: Alles auswählen

def remove_files(path):
    for filename in glob.glob(os.path.join(path, 'CONNECT*'):
        print("{} wird entfernt".format(filename))
        shutil.rmtree(filename)
Vielen Dank für die Hinweise Ich habe mich vorerst für deinen ersten Vorschlag entschieden, da ich dort die genauen Abläufe besser verstehe.

Die "Sonderzeile" für das `CONNECT_11043_5` hatte ich vergessen rauszunehmen.

Ich werde mich etwas Intensiver mit 'glob' beschäftigen, damit ich die Abläufe wirklich verstehe und diese nicht einfach anwende.

Die Sleep funktionen nutze ich gerne damit der Text länger sichtbar ist und die Anwender etwas zeit haben den Ablauf zu beobachten.
(gibt es da bessere Lösungen?)

Ich bin dir sehr dankbar für die Hilfe mein "fertiges" Programm sieht nun folgendermaßen aus

Code: Alles auswählen

# -*- coding: utf-8 -*-
"""
Created on Tue Dec  4 08:45:14 2018

@author: cpohlmann
"""

import os
import time
import sys
import shutil
import re

path_new = r"\\srv-23v-isea-01\temp\CPO\aft_CONNECT"

def remove_files(path):
    for filename in os.listdir(path):
        if filename.startswith('CONNECT_'):
            print(os.path.join(path, filename + " wird entfernt"))
            shutil.rmtree(os.path.join(path, filename))

def add_files(path_new):
    for filename_new in os.listdir(path_new):
        if filename_new.startswith('CONNECT_'):
            print(os.path.join(path_new, filename_new + " wird eingefügt"))
            shutil.copytree(os.path.join(path_new, filename_new), os.path.join(path, filename_new))
            
for path in [
    r"C:\cad\VWG\catia\vwgrclite\opt\aft",
    r"C:\CATIAV5\VWG\catia\vwgrclite\opt\aft",
    ]:
    
    if os.path.isdir(path):
        remove_files(path)
        time.sleep(2)
        os.system("cls")
        add_files(path_new)
        time.sleep(2)
        os.system("cls")
        print("Der Austausch ist abgeschlossen und das Programm wird nun beendet")
        time.sleep(2)
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

`glob` faßt einfach die Schritte listdir, if-Filterung und os.path.join in einer Funktion zusammen. Mehr ist da eigentlich nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 13102
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@TheBombTuber: Neben den `sleep()`-Aufrufen solltest Du ganz einfach auch die ``os.system("cls")``-Aufrufe entfernen. Schon gibt's das Problem das Du mit `sleep()` lösen möchtest nicht mehr.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten