ins Unterverzeichnis (nur eine Ebene) wechseln

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.
Aramis
User
Beiträge: 17
Registriert: Dienstag 29. Mai 2018, 09:41

Hi,

ich habe ein Skript, welches im Ordner A ausgeführt wird. Das Skript lädt andere Dateien und einen OrdnerX in Ordner A. Wie genau dieser Ordner X heisst weiss ich vorher nicht. Jedoch muss der Rest vom Skript ab dem Moment, wo der OrdnerX geladen ist dort weitermacht. Wie kann ich jetzt eine Ebene tiefer wechseln? Dh. im Skript würde ich den neuen Pfad definieren und dann an die Funktion übergeben.

nur wie definiere ich diesen Pfad?
Ich hab schon mit new_path=os.path.abspath("./.") probiert, aber da gehts nur nach oben und nicht nach unten die der Verzeichnisstruktur.

vielen Dank.
Aramis
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Es heißt auch `..`. So ganz werde ich aus Deiner Beschreibung nicht schlau.
Aramis
User
Beiträge: 17
Registriert: Dienstag 29. Mai 2018, 09:41

ich hab so eine Funktion gerad geschrieben um das Verzeichnis zu wechseln. Aber irgendwo ist da noch ein Haken. Es funktioniert nicht.

Code: Alles auswählen

def change_dir(path='.'):

    for filename in os.listdir(path):
        if os.path.isdir(os.path.join(path, filename)) is True:
            new_path=os.path.join(path,filename)
            #list_files(os.path.join(path, filename))
    print(new_path)
    os.chdir(new_path)



es würde auf der Kommandozeile dem Befehl cd entsprechen. Nur dass ich zu dem Zeitpunkt nicht den genauen Ordnernamen kenne. Ich weiss nur, dass es ein Unterordner im Verzeichnis ist, wo ich mich gerade befinde.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Aramis: An den Ordner in dem das Modul liegt, kommst Du mit ``os.path.dirname(__file__)``. Und wechseln im Sinne von den aktuellen Arbeitspfad des Prozesses ändern sollte man nicht machen. Vergiss `os.chdir()` am besten gleich wieder. Das ist globaler Zustand.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Ein `is True` ist meist überflüssig. chdir solltest Du nicht benutzen. Das ändert einen globalen Zustand, was dazu führen kann, dass an anderer Stelle erwartet wird, dass relativ zu einem Verzeichnis irgendeine Datei zu finden ist, was dann nicht mehr funktioniert.

Was ist Dein eigentliches Problem? Nicht beschreiben, wie Du denkst, dass das Problem zu lösen ist.
Aramis
User
Beiträge: 17
Registriert: Dienstag 29. Mai 2018, 09:41

@Sirus3: ok, ich probiers mal aufzuschreiben.
in einen leeren Ordner werden die Daten aus einem anderen (externen) Verzeichnis kopiert. in diesen kopierten Daten befinden sich bestimmte KeyWörter die ich über eine Suche auslese.
Nun muss mein Skript ja in die kopierten Unterordner rein und dort suchen. Und das ist mein Problem. das die Suchfunktion (die funktioniert) einfach die Unterebenen durchläuft. rekursiv abwärts.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Also möchtest Du von einer Wurzel aus alle Unterordner durchsuchen, das geht mit os.walk, bzw. moderner mit pathlib.Path.glob:

Code: Alles auswählen

for filename in pathlib.Path(basepath).glob('**/*'):
    print(filename)
Aramis
User
Beiträge: 17
Registriert: Dienstag 29. Mai 2018, 09:41

bekomme eine Fehlermeldung:

Code: Alles auswählen

from pathlib import Path
NameError: name 'pathlib' is not defined

(das Package ist installiert....hab ich nachgeschaut)
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Aramis: Wenn es installiert ist, dann kann man es auch importieren. Wie hast Du denn nachgeschaut? Sicher das Du beim richtigen Pythoninterpreter nachgeschaut hast wenn Du mehrere auf dem System installiert hast?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Aramis
User
Beiträge: 17
Registriert: Dienstag 29. Mai 2018, 09:41

ja, des passt....
es ist wie verhext. :(
narpfel
User
Beiträge: 644
Registriert: Freitag 20. Oktober 2017, 16:10

Ich würde eher folgendes vermuten:

Code: Alles auswählen

>>> from pathlib import Path
>>> pathlib.Path().glob("**/*")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'pathlib' is not defined
>>> Path().glob("**/*")
<generator object Path.glob at 0x7fb5db34af68>
`import` ist im Kapitel „Modules“ des offiziellen Tutorials beschrieben.
Aramis
User
Beiträge: 17
Registriert: Dienstag 29. Mai 2018, 09:41

Code: Alles auswählen

 for filename in pathlib.Path(basepath).glob('**/*'):
NameError: name 'pathlib' is not defined
das ist der einzige Fehlercode: davor noch die Zeile in der Datei wo der code steht. mehr nicht.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Steht da nun ein `import pathlib` oder nicht?
Aramis
User
Beiträge: 17
Registriert: Dienstag 29. Mai 2018, 09:41

ja klar, hab ich oben bei den Imports importiert.
narpfel
User
Beiträge: 644
Registriert: Freitag 20. Oktober 2017, 16:10

@Aramis: Das kann nicht sein. Wenn `import pathlib` keinen Fehler auslöst, ist danach der Name `pathlib` vorhanden. Bitte zeige den kompletten Code (am besten als Minimalbeispiel), sonst können wir nur raten oder Vermutungen anstellen.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn es dann nicht funktioniert, zeige bitte den kompletten Code inklusive Fehlermeldung und komplettem Traceback, damit wir das Problem nachvollziehen können.
Aramis
User
Beiträge: 17
Registriert: Dienstag 29. Mai 2018, 09:41

wenn ich die Suchfunktion in dem Unterordner laufen lasse, findet sie mir genau das was ich suche. nur liegt das Skript halt ein Verzeichnis drüber.
das jeweilige Keyword endet mit einem Leerzeichen, deshalb nochmal die if Abfrage nach dem index_blank.

Code: Alles auswählen

def search_keyword():
    for filename in pathlib.Path(basepath).glob('**/*'):
        out_shell = Popen([shellcmd], stdout=PIPE)
        out_data = output_cmd.communicate()[0]
    
        search_index = str(out_data).find(keyword)  
    
        if search_index is not -1:
            index_blank = str(out_data).find('\n', search_index)
            if search_index_blank is -1:  
                print(str(out_data)[search_index:]) 
            else:
                print(str(out_data)[search_index:index_blank])  
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

An dem Quelltext sieht man jetzt aber nicht wo Du `pathlib` importierst, also nur diese Funktion wird zu einem `NameError` führen. Ausserdem kommen `output_cmd`, `keyword`, und `search_index_blank` einfach magisch aus dem nichts. Das sollte nicht sein. Alles, ausser Konstanten, was eine Funktion oder Methode an Werten braucht, sollte die Funktion/Methode als Argument(e) betreten. Wobei ich gerade sehe das `output_cmd` wahrscheinlich `out_shell` heissen sollte, das also ziemlich sicher nicht der Quelltext ist, den Du tatsächlich mal hast laufen lassen. Es macht nicht so viel Sinn Fehler in einem ähnlichen Quelltext statt dem tatsächlichen zu suchen. Kann es sein das es bei `search_index_blank` ähnlich ist? `blank` ist übrigens ein Leerzeichen und kein Zeilenende.

`filename` wird überhaupt nicht verwendet, was soll das da also?

``is`` und ``is not`` sind hier falsch verwendet. Es ist Zufalls dass das funktioniert. Wenn Du auf Gleichheit/Ungleicheit testen möchtest, dann verwende ``==`` und ``!=``. ``is`` und ``is not`` beziehen sich nicht auf den Wert, sondern auf die Objektidentität.

Ich persönlich verwende `find()` gar nicht, sondern lieber `index()`. Das löst eine Ausnahme aus wenn nichts gefunden wird. Ist mir sicherer als ein Zahlenwert der zufällig auch ein gültiger Index wäre wenn man nicht aufpasst.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Aramis
User
Beiträge: 17
Registriert: Dienstag 29. Mai 2018, 09:41

@__blackjack__ Sorry, ich hab versucht die Namen zu editieren, dass es leichter lesbar ist. ist wohl nach hinten losgegangen. ...
Aramis
User
Beiträge: 17
Registriert: Dienstag 29. Mai 2018, 09:41

das wäre der Code:
die pathlib for Schleife hab ich wieder rausgenommen. aber der Import steht oben.

Code: Alles auswählen

import os
import sys
import subprocess
from subprocess import Popen, PIPE
from subprocess import call
from pathlib import Path

keyword = 'irgendwas'

def import_dir():
    subprocess.call(['git', 'clone', 'http://xyz/.git'])


# an dieser Stelle muss die search funktion im Unterverzeichnis anfangen zu arbeiten
# also wechsel eine Ebene tiefer und dann weiter ...

def search():
    shell_cmd = Popen(["git", "log", "--all"], stdout=PIPE)
    data = shell_cmd.communicate()[0]

    search_index = str(data).find(keyword)

    if search_index != -1:
        index_blank = str(data).find('\n', search_index)
        print(str(data)[search_index:index_blank])



import_dir()
search()
Antworten