Liste mit TIF-Bildern für den jeweiligen Unterordner anlegen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
mediamarc
User
Beiträge: 16
Registriert: Freitag 1. Juli 2022, 09:24

Hallo zusammen,

ich bin gerade etwas am verzweifeln, da ich versuche eine Liste mit Bildern des jeweiligen Unterordners anzulegen. Leider werden alle Fotos gemeinsam in eine Liste gepackt, obwohl sie in zwei (oder mehreren) verschiedenen Unterordnern zu finden sind. Mein Ziel ist es, dass die TIF-Bilder eines Unterordners gemeinsam von Metashape durchgearbeitet werden können, um so schließlich eine Punktwolke der jeweiligen Session zu erzeugen. Meine Ordnerstruktur ist wie folgt:
/RAW
/StechzylinderABC/converted/
/StechzylinderXYZ/converted/

Hier mein Code:

Code: Alles auswählen

import os

# Set working directory
os.chdir("/mnt/HDD2/backupStechzylinder/Bodenzylinder_Fotos/RAW/")
path = os.getcwd()
print("Working Directory: ", path)

# create photo_list
photo_list = []

for path, dirs, files in os.walk(path, topdown=False):
    for filename in files:
        if filename.endswith(".tif"):
            file_path = os.path.join(str(dirs), filename)
            photo_list.append(file_path)
            print("Photos found: " + str(filename))
            print(photo_list)
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

`os.chdir` sollte in einem ordentlichen Programm nicht vorkommen, ist bei Dir auch gar nicht nötig.
Dateinamen sind keine einfachen Strings, deshalb sind Stringmethoden wie endswith falsch.
Statt der os.path-Methoden benutzt man heutzutage pathlib.Path.
Hast Du Dir mal angeschaut, was in photo_list drinsteht? Offensichtlich nicht, denn sonst müßte Dir aufgefallen sein, dass ›str(dirs)‹ völliger Quatsch ist.
Strings setzt man nicht mit + zusammen, filename ist bereits ein String, das umwandeln per str also unnötig.
Wenn Du nicht alles in einer Liste haben willst, dann mußt Du halt mehrere Listen erzeugen.

Code: Alles auswählen

from pathlib import Path
from collections import defaultdict

PHOTO_PATH = Path("/mnt/HDD2/backupStechzylinder/Bodenzylinder_Fotos/RAW/")

def main():
    print("Working Directory: ", PHOTO_PATH)

    photo_list = defaultdict(list)
    for filename in PHOTO_PATH.rglob('*.tif')
        PHOTO_PATH[filename.parent].append(filename)
        print("Photos found: ", filename)
    print(photo_list)

if __name__ == "__main__":
    main()
mediamarc
User
Beiträge: 16
Registriert: Freitag 1. Juli 2022, 09:24

Vielen Dank für Deine schnelle Antwort! Nun stehe ich aber vor einem weiteren Problem. Da ein Dictionary erstellt wurde, bei dem die Bilderpfade dem übergeordneten Ordner zugeordnet werden, versuche ich nun auf den "Key" für die erste Bilderliste zuzugreifen.
Hier ein Beispiel der Ausgabe als Dict mit Listen:

Code: Alles auswählen

Photoliste:  defaultdict(<class 'list'>, {PosixPath('/mnt/HDD2/backupStechzylinder/Bodenzylinder_Fotos/RAW/Zylinder3514_nochmal_oben/converted'): [PosixPath('/mnt/HDD2/backupStechzylinder/Bodenzylinder_Fotos/RAW/Zylinder3514_nochmal_oben/converted/DSC_7861.tif'), ........
Wenn ich nun nach den Keys abfrage, erhalte ich folgende Ordnerpfade:

Code: Alles auswählen

dict_keys([PosixPath('/mnt/HDD2/backupStechzylinder/Bodenzylinder_Fotos/RAW/Zylinder3514_nochmal_oben/converted'), PosixPath('/mnt/HDD2/backupStechzylinder/Bodenzylinder_Fotos/RAW/Zylinder3529/converted')])
Nun habe ich versucht den jeweiligen Pfad als Key abzurufen, was jedoch eine leere Liste ausgibt:

Code: Alles auswählen

 listeselect = photo_list["PosixPath('/mnt/HDD2/backupStechzylinder/Bodenzylinder_Fotos/RAW/Zylinder3514_nochmal_oben/converted')"]
    print(listeselect)
Ausgabe: Ich bin gerade etwas ratlos. Irgendetwas mache ich wohl falsch...



Sirius3 hat geschrieben: Samstag 6. Mai 2023, 17:16 `os.chdir` sollte in einem ordentlichen Programm nicht vorkommen, ist bei Dir auch gar nicht nötig.
Dateinamen sind keine einfachen Strings, deshalb sind Stringmethoden wie endswith falsch.
Statt der os.path-Methoden benutzt man heutzutage pathlib.Path.
Hast Du Dir mal angeschaut, was in photo_list drinsteht? Offensichtlich nicht, denn sonst müßte Dir aufgefallen sein, dass ›str(dirs)‹ völliger Quatsch ist.
Strings setzt man nicht mit + zusammen, filename ist bereits ein String, das umwandeln per str also unnötig.
Wenn Du nicht alles in einer Liste haben willst, dann mußt Du halt mehrere Listen erzeugen.

Code: Alles auswählen

from pathlib import Path
from collections import defaultdict

PHOTO_PATH = Path("/mnt/HDD2/backupStechzylinder/Bodenzylinder_Fotos/RAW/")

def main():
    print("Working Directory: ", PHOTO_PATH)

    photo_list = defaultdict(list)
    for filename in PHOTO_PATH.rglob('*.tif')
        PHOTO_PATH[filename.parent].append(filename)
        print("Photos found: ", filename)
    print(photo_list)

if __name__ == "__main__":
    main()
[/quote]
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Schlüssel sind Path-Objekte:

Code: Alles auswählen

photo_list[Path('/mnt/HDD2/backupStechzylinder/Bodenzylinder_Fotos/RAW/Zylinder3514_nochmal_oben/converted')]
Das sollte aber so gar nicht nötig sein, weil Dein Programm doch wahrscheinlich per photo_list.items() alle Elemente durchgehen wird.
mediamarc
User
Beiträge: 16
Registriert: Freitag 1. Juli 2022, 09:24

So, habe es gelöst. Vielen Dank Dir!
Antworten