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
ins Unterverzeichnis (nur eine Ebene) wechseln
ich hab so eine Funktion gerad geschrieben um das Verzeichnis zu wechseln. Aber irgendwo ist da noch ein Haken. Es funktioniert nicht.
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.
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.
- __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
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.
Was ist Dein eigentliches Problem? Nicht beschreiben, wie Du denkst, dass das Problem zu lösen ist.
@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.
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.
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)
bekomme eine Fehlermeldung:
(das Package ist installiert....hab ich nachgeschaut)
Code: Alles auswählen
from pathlib import Path
NameError: name 'pathlib' is not defined
(das Package ist installiert....hab ich nachgeschaut)
- __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
Ich würde eher folgendes vermuten:
`import` ist im Kapitel „Modules“ des offiziellen Tutorials beschrieben.
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>
Code: Alles auswählen
for filename in pathlib.Path(basepath).glob('**/*'):
NameError: name 'pathlib' is not defined
@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.
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.
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])
- __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.
`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
das wäre der Code:
die pathlib for Schleife hab ich wieder rausgenommen. aber der Import steht oben.
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()