Daten auslesen

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.
Eisi
User
Beiträge: 62
Registriert: Sonntag 24. November 2013, 21:59

So nochmal ein wenig rum probiert und musste feststellen, dass wenn ich

Code: Alles auswählen

def iter_project_paths(root_path):
    return filter(is_project_path, os.listdir(root_path))
teste und als liste mit print ausgebe nur "[]" erscheint. Ich denke das wird das problem verursachen
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das kann eigentlich nur zwei Ursachen haben:

1. Du übergibst als ``root_path`` nicht den tatsächlichen Projektordner - also den Pfad, dessen Unterverzeichnisse die eigentlichen Projekte sind.

2. In ``PROJECT_SUB_DIRS`` sind nicht die Ordernamen deiner Projekte enthalten (hier *keine* vollständige Pfadangabe, sondern wirklich nur den Namen des einzelnen Ordners).

Hilfreich zum Debugging wären natürlich entsprechende ``print()``-Ausgaben und eine detailliertere Beschäftigung mit dem vorgesetzten Code, damit man wenigstens ansatzweise versteht, was da eigentlich passiert.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mir fällt gerade eine Schwäche an BlackJacks Code auf: ``is_project_path()`` testet ``os.path.isdir(path)``, bekommt aber jeweils einen Eintrag vom ``os.listdir()``-Aufruf. Letzteres liefert aber keine absoluten Pfadangaben, sondern nur die Dateinamen. Folglich schlägt der Test fehl, sobald der übergebene ``root_path`` nicht dem Verzeichnis entspricht, von wo aus das Skript gestartet wurde. Hiermit revidiere ich übrigens die zuvor gemachte (implizite) Feststellung, dass der Fehler nur beim Benutzer liegen kann. :)
Eisi
User
Beiträge: 62
Registriert: Sonntag 24. November 2013, 21:59

snafu hat geschrieben: 2. In ``PROJECT_SUB_DIRS`` sind nicht die Ordernamen deiner Projekte enthalten (hier *keine* vollständige Pfadangabe, sondern wirklich nur den Namen des einzelnen Ordners).
Nein in PROJECT_SUB_DIRS (sollten) sind die Unterverzeichnisse der Projekte die ja immer den gleichen Namen enthalten. Der Name der sich ändert ist ja nur der Projektname selber.

Pfade sind überprüft und auch die Namen der Unterordner sind soweit korrekt.

root_path = 'C:\\Users\\Christoph\\Desktop\\python\\test'

Der Pfad zum Projekt(Dessen Name unvorhersehbar ist) sieht dann z.B. so aus: C:\\Users\\Christoph\\Desktop\\python\\test\\Projekt1

wo sich dann die 6 Unterordner befinden die immer den gleichen namen haben.z.B.
C:\\Users\\Christoph\\Desktop\\python\\test\\Projekt1\\Unterordner1
C:\\Users\\Christoph\\Desktop\\python\\test\\Projekt1\\Unterordner2
C:\\Users\\Christoph\\Desktop\\python\\test\\Projekt1\\Unterordner3
C:\\Users\\Christoph\\Desktop\\python\\test\\Projekt1\\Unterordner4
C:\\Users\\Christoph\\Desktop\\python\\test\\Projekt1\\Unterordner5
C:\\Users\\Christoph\\Desktop\\python\\test\\Projekt1\\Unterordner6

In jedem dieser 6 Ordner befindet sich dann die Datei die immer gleich heißt

C:\\Users\\Christoph\\Desktop\\python\\test\\Projekt1\\Unterordner1\\test.txt

Nur um das nochmal zu veranschaulichen. Nicht das ich am anfang irgendwo falsch verstanden wurde. :roll:
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wenn man die betreffende Funktion mit der folgenden ersetzt, dann müsste es funktionieren:

Code: Alles auswählen

def iter_project_paths(root_path):
    return (
        is_project_path(os.path.join(root_path, sub_dir))
        for sub_dir in os.listdir(PROJECT_SUB_DIRS)
    )
EDIT: Korrektur...

Code: Alles auswählen

def iter_project_paths(root_path):
    dirnames = (
        os.path.join(root_path, sub_dir)
        for sub_dir in os.listdir(PROJECT_SUB_DIRS)
    )
    return filter(is_project_path, dirnames)
Zuletzt geändert von snafu am Montag 12. Mai 2014, 15:13, insgesamt 2-mal geändert.
Eisi
User
Beiträge: 62
Registriert: Sonntag 24. November 2013, 21:59

for sub_dir in os.listdir(PROJECT_SUB_DIRS)
TypeError: listdir: illegal type for path parameter

vielleicht mit 3.4 nicht kompatibel?

Auch mit dem geänderten der gleiche fehler
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

OMG, ich produzier hier voll den Müll... :oops:

Es muss ``os.listdir(root_path)`` heißen.
Eisi
User
Beiträge: 62
Registriert: Sonntag 24. November 2013, 21:59

halleluja es klappt! Ich bin euch zu großen dank verpflichtet! Jetzt Studiere ich erstmal nochmal alles damit ich es auch nachvollziehen kann was genau nun da passiert :)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Na, das ist doch schön. Dein Einwand zu meinem Punkt 2 war übrigens korrekt.
BlackJack

Ich habe halt gemacht was man nicht machen sollte: mehrere Funktionen runterschreiben ohne irgendwas davon auch tatsächlich mal zu testen. :-)
Eisi
User
Beiträge: 62
Registriert: Sonntag 24. November 2013, 21:59

Code: Alles auswählen

def is_project_path(path):
    return os.path.isdir(path) and all(
        os.path.isdir(os.path.join(path, sub_directory))
        for sub_directory in PROJECT_SUB_DIRS
    )
woher bekommt in dem script die funktion den wert für "path"? ich studiere gerade nochmal das Script und kann mir nicht zusammenreimen was es mit dem Path auf sich hat.
BlackJack

@Eisi: Der wird ganz offensichtlich als Argument an die Funktion übergeben.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Steht in der Doku zu ``filter``: https://docs.python.org/3.4/library/fun ... tml#filter
hier:
Note that filter(function, iterable) is equivalent to the generator expression (item for item in iterable if function(item)) if function is not None and (item for item in iterable if item) if function is None.
Eisi
User
Beiträge: 62
Registriert: Sonntag 24. November 2013, 21:59

Wie macht man es wenn man 2 unbekannte in einem Pfad hat?

Beispielpfad: C:\user\project\test1\test2\project2\

Im Ordner Project sind viele ordner mit unbekannten namen die alle durchsucht werden sollen und in project2 soll z.b. die direkt da drin liegende test.txt durchsucht werden. Wobei Project2 auch immer einen anderen namen hat der inhalt aber wieder mit bekannten ordnern und der .txt gefüllt ist. Erstmal befindet sich die gesuchte .txt aber direct in project2 und nicht im unterordner davon.
Eisi
User
Beiträge: 62
Registriert: Sonntag 24. November 2013, 21:59

Oder gibt es vielleicht einen Befehl der den kompletten Pfad mit unterordnern nach einer datei durchsucht und mir beim finden den pfad ausspuckt?
BlackJack

@Eisi: Fertig nicht, aber das lässt sich mit `os.walk()` doch sehr leicht selber schreiben.
Eisi
User
Beiträge: 62
Registriert: Sonntag 24. November 2013, 21:59

Code: Alles auswählen

for curdir, dirs, files in os.walk(root_path):
     if filename in files:
        with open(filename, 'r') as lines:
            if any(needle in line for line in lines):
                print(curdir, dirs, files)
so sieht mein code aus. Und er spuckt immer das aus:

Traceback (most recent call last):
File "E:\python\path.py", line 30, in <module>
with open(filename, 'r') as lines:
FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'

dazu muss man sagen das es keine test.txt beim ausführen ist sondern eine ".NC" datei die ursprünglich von Linux kommt, was aber bisher noch nie ein problem war.

Wenn ich Zeile 3 - 5 weg lasse und ein print als ergebnis ausgeben lasse klappt es.
BlackJack

@Eisi: Du musst den Pfad dorthin noch mit `os.path.join()` davor setzen, denn so wie es jetzt ist versuchst Du eine ``test.txt`` im aktuellen Arbeitsverzeichnis des Prozesses zu öffnen.
Eisi
User
Beiträge: 62
Registriert: Sonntag 24. November 2013, 21:59

wo genau muss denn das os.path.join() hin?

glaube habs jetzt:

Code: Alles auswählen

for curdir, dirs, files in os.walk(root_path):
    if filename in files:
        with open(os.path.join(curdir, filename), 'r') as lines:
            if any(needle in line for line in lines):
                print(curdir, dirs, files)
Antworten